为什么'删除'堆的操作(不是最大或最小)取O(n)?

时间:2017-05-14 00:15:47

标签: algorithm data-structures heap

众所周知,删除堆上的操作需要O(n)(注意:不是最大值或最小值)。我知道堆不适合删除或更新,但有点好奇。

我认为,如果我想删除某些元素,我认为只需percDown(element)heapSize--即可完成....所以我认为需要O(logn)

我错过了什么吗?

1 个答案:

答案 0 :(得分:0)

我假设您正在谈论基于标准阵列的完整二叉树实现。

简短的回答是它不需要。如果您维护从堆中的对象到存储它们的索引的并行映射,那么您可以使用筛选操作在O(log n)中删除以将堆属性恢复为“填充删除所创建的漏洞”。 / p>

朴素的实现需要O(n),因为它们首先搜索堆数组。堆属性没有任何帮助使其比O(n)更有效。

如果您感兴趣,here is an implementation将一堆索引保存到一个对象数组中(而不是将对象保留在堆节点中)和一个反向索引 - 只是一个整数数组 - 它需要一个索引在对象数组中,它在堆数组中的索引。此反向映射不会更改任何其他操作的渐近运行时间,但它提供O(log n)删除。