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

Algorithm 为什么';删除';堆取O(n)的操作(不是最大值或最小值)?,algorithm,data-structures,heap,Algorithm,Data Structures,Heap,众所周知,在堆上删除操作需要O(n)(注意:不是最大值或最小值)。我知道heap不适合删除或更新,但有点奇怪 我想如果我想删除某个元素,我想只要perdown(element)和heapSize--就可以了……所以我认为需要O(logn) 我错过了什么吗?我想你说的是标准的基于数组的完整二叉树实现 简而言之,它不需要这样做。如果您维护从堆中的对象到存储它们的索引的并行映射,那么您可以使用筛选操作在O(log n)中删除,以恢复堆属性以“填补删除所创建的漏洞” 简单的实现需要O(n),因为它们从搜

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

我想如果我想删除某个元素,我想只要
perdown(element)
heapSize--
就可以了……所以我认为需要
O(logn)


我错过了什么吗?

我想你说的是标准的基于数组的完整二叉树实现

简而言之,它不需要这样做。如果您维护从堆中的对象到存储它们的索引的并行映射,那么您可以使用筛选操作在O(log n)中删除,以恢复堆属性以“填补删除所创建的漏洞”

简单的实现需要O(n),因为它们从搜索堆数组开始。关于heap属性,没有什么比O(n)更有效的了


如果您感兴趣,可以将索引堆保留在对象数组中(而不是将对象保留在堆节点中)和反向索引(只是一个整数数组),后者将对象数组中的索引与堆数组中的索引进行比较。此反向映射不会更改任何其他操作的渐进运行时间,但它提供了O(log n)delete。

谢谢,它真的很有帮助:)