众所周知,删除堆上的操作需要O(n)
(注意:不是最大值或最小值)。我知道堆不适合删除或更新,但有点好奇。
我认为,如果我想删除某些元素,我认为只需percDown(element)
和heapSize--
即可完成....所以我认为需要O(logn)
?
我错过了什么吗?
答案 0 :(得分:0)
我假设您正在谈论基于标准阵列的完整二叉树实现。
简短的回答是它不需要。如果您维护从堆中的对象到存储它们的索引的并行映射,那么您可以使用筛选操作在O(log n)中删除以将堆属性恢复为“填充删除所创建的漏洞”。 / p>
朴素的实现需要O(n),因为它们首先搜索堆数组。堆属性没有任何帮助使其比O(n)更有效。
如果您感兴趣,here is an implementation将一堆索引保存到一个对象数组中(而不是将对象保留在堆节点中)和一个反向索引 - 只是一个整数数组 - 它需要一个索引在对象数组中,它在堆数组中的索引。此反向映射不会更改任何其他操作的渐近运行时间,但它提供O(log n)删除。