跟踪堆内的节点

时间:2013-03-13 21:17:25

标签: algorithm data-structures heap

我有这个问题 - 我保留的数据结构包含两个不同的堆,最小堆和包含相同数据的最大堆。

我的目标是为任何一个堆中的每个节点位置保留某种记录,并使用堆操作更新它。 底线 - 我试图找出如何在lg(n)复杂度中使用delete(p)函数。 p是一个可以保存任何数据的指针数据对象。

谢谢, 奈德。

1 个答案:

答案 0 :(得分:1)

如果你的堆被实现为一个项目数组(例如引用),那么你可以在O(n)时间内轻松找到堆中的任意项。一旦您知道项目在堆中的位置,就可以在O(log n)时间内将其删除。所以查找和删除是O(n + log n)。

如果您将堆与字典或哈希映射配对,则可以实现删除O(log n),如我在this answer中所述。

在O(log n)时间内删除任意项目将解释为here

字典方法的技巧是字典包含一个键(项键)和一个值,它是节点在堆中的位置。每当您移动堆中的节点时,都会更新字典中的该值。在这种情况下,插入和删除稍微慢一点,因为它们需要补充log(n)字典更新。但是那些更新是O(1),所以它不是非常昂贵。

或者,如果您的堆实现为二叉树(使用指针,而不是数组中的隐式结构),那么您可以在字典中存储指向节点的指针,而不必在插入时更新它从堆中删除。

话虽这么说,配对数据结构中添加和删除min(或删除最大堆max)的实际性能将低于作为数组实现的标准堆,除非你做了很多任意删除。如果你每隔一段时间只删除一个任意项目,特别是如果你的堆很小,你可能会更好地使用O(n)删除性能。实现起来比较简单,当n很小时,O(n)和O(log n)之间几乎没有真正的区别。