进行sink_down操作,操作完成之后再删除data_arr相应位置元素。最后将index_arr中值大于原index_arr头部元素值的减一。

来源:4-8 索引堆(Index Heap)

woshininengge

2019-12-27

索引堆再进行删除元素时候,老师讲的那种只交换索引列表的首尾元素然后删除末尾元素不够吧,假设索引堆原本的范围是1-6,而最大的元素的索引是4,把4删除了,索引列表里只有1,2,3,5,6。请问6已经超过索引的范围了!在删除元素时,我们原先是将data_arr中的首尾元素互换,再删除尾部元素,再对头部元素进行sink_down操作。现在我们先换索引数组中首尾元素,再删除索引数组尾部元素,此时尚未操作存放data的data_arr,因此索引数组剩余元素与data_arr的元素仍是一一对应的。进行sink_down操作,操作完成之后再删除data_arr相应位置元素。最后将index_arr中值大于原index_arr头部元素值的减一。

写回答

1回答

liuyubobobo

2019-12-27

这里的关键是,索引堆不是这么用的。索引堆中的索引不一定只是前 n 个元素。对一个空的索引堆,可以直接添加索引为 4 的元素。此时,这个索引堆中有一个元素,这个元素的索引是 4。1-3 和 5-6 索引的元素不存在。而不是添加的第一个元素,索引一定是 1。否则的话,就不需要这个索引了。


索引堆为什么这么设计?可以参考这个问答下我的回答:https://coding.imooc.com/learn/questiondetail/99784.html


继续加油!:)

0
2
liuyubobobo
回复
woshininengge
这个课程的所有代码,已经有同学使用 python 完全实现了出来。使用 python 学习的同学,可以在理解课程代码逻辑的基础上,参考相关的 python 代码哦。传送门:https://github.com/nicemayi/play-with-algorithms 继续加油!:)
2019-12-27
共2条回复

算法与数据结构(C++版) 面试/评级的算法复习技能包

课程专为:短时间内应对面试、升职测评等艰巨任务打造

11187 学习 · 1614 问题

查看课程