Data structures 堆真的只能使用O(1)辅助存储吗?

Data structures 堆真的只能使用O(1)辅助存储吗?,data-structures,language-agnostic,heap,binary-search-tree,space-complexity,Data Structures,Language Agnostic,Heap,Binary Search Tree,Space Complexity,将堆用于优先级队列(与红黑树相反)的最大优点之一似乎是空间效率:与平衡的BST不同,堆只需要O(1)个辅助存储。 i、 例如,元素的顺序就足以满足堆的不变量和保证,并且不需要子/父指针 然而,我的问题是:上述情况是否属实 在我看来,为了在满足O(logn)运行时保证的同时使用基于数组的堆,数组必须是动态可扩展的 我们可以在O(1)时间内动态扩展数组的唯一方法是过度分配支持数组的内存,这样我们就可以将内存操作分摊到未来 但是,过度分配不意味着堆也需要辅助存储吗 如果以上是真的,这似乎意味着堆与平衡

将堆用于优先级队列(与红黑树相反)的最大优点之一似乎是空间效率:与平衡的BST不同,堆只需要O(1)个辅助存储。
i、 例如,元素的顺序就足以满足堆的不变量和保证,并且不需要子/父指针

然而,我的问题是:上述情况是否属实

在我看来,为了在满足O(logn)运行时保证的同时使用基于数组的堆,数组必须是动态可扩展的

我们可以在O(1)时间内动态扩展数组的唯一方法是过度分配支持数组的内存,这样我们就可以将内存操作分摊到未来

但是,过度分配不意味着堆也需要辅助存储吗


如果以上是真的,这似乎意味着堆与平衡的BST相比没有任何复杂性优势,那么,从理论角度看,堆“有趣”的原因是什么呢?

您似乎混淆了二进制堆、一般的堆以及使用数组而不是显式树结构的二进制堆的实现

二进制堆只是一个二叉树,其属性使其在理论上比内存使用更有趣。它们可以在线性时间内构建,而构建BST必然需要n个logN时间。例如,这可用于在优于n log n的时间内选择序列的k个最小/最大值

将二进制堆实现为数组会产生隐式数据结构。这是一个理论家形式化的话题,但大多数理论家并未积极探讨。但在任何情况下,分类都是合理的:要动态扩展此结构,确实需要过度分配,但并非每个数据结构都必须动态增长,因此静态大小的预分配数据结构的情况也很有趣

此外,在快速增长所需的空间和所需的空间之间存在差异,因为每个元素都比必须的大。第一种方法可以通过不增长来避免,并且还可以减少到总大小的任意小的常数因子,代价是在运行时间上增加一个更大的常数因子。后一种类型的空间开销通常是不可避免的,并且不能减少很多(树中的指针至少是logn位,周期)

最后,除了二进制堆之外,还有许多堆(斐波那契、二项式、左撇子、配对等),除了二进制堆之外,几乎所有堆都为至少一些操作提供了更好的边界。最常见的是减少键(以某种方式改变结构中已有的键的值)和合并(将两个堆合并为一个)。这些操作的复杂性对于使用优先级队列的几种算法的分析非常重要,因此需要对堆进行大量研究


实际上内存的使用很重要。但是(有过度分配和无过度分配),总体而言,差异只是一个常数,因此理论家对二进制堆不太感兴趣。他们宁愿降低密钥和合并的复杂度;如果数据结构占用O(n)空间,大多数人都会感到高兴。极高的内存密度、易实现性和缓存友好性对实践者来说更加有趣,正是他们在广泛地赞美二进制堆。

+1惊人的答案,谢谢!但问题是:decrease key可以像其他堆一样在二进制堆上轻松实现,对吗?@Mehrdad取决于您所说的“轻松”是什么意思。问题不在于减少键是否正确,问题在于使其变快(而不使其他操作变慢)。对于二进制堆,没有已知的算法比删除旧密钥并插入新密钥更好,这需要线性时间。大多数其他堆的构造使得更高效(次线性)的减少密钥是可能的,并且相当简单。在这里很难比较实现的易用性,特别是因为它取决于所讨论的堆变量(它们有很大的差异,还取决于您要优化的程度)。等等,真的吗?我很困惑,因为如果你看一下他们在对数时间内实现d元堆(这里是d=2)的减少键和增加键绝对没有问题。。。我遗漏了什么吗?@Mehrdad该方法需要已更改节点上的句柄。理论家包括找到该节点的时间,即提供一个键值,并且必须找到堆中的位置。这是合理的,因为如果不能仅使用堆快速查找句柄,则需要第二个数据结构来快速查找句柄,或者需要进行线性搜索(这是在二进制堆的O(n)界中假设的)。如果你真的有把手,那就发疯吧。但如果不是这样,并且您使用了更复杂的堆结构,您可以在零额外工作或内存的情况下比对数时间做得更好。哦!所以你的意思是“查找元素”是其他堆的对数时间,而不是“减少”部分。。。哇,我没意识到。但在这种情况下,如果你能在对数时间内找到任何元素,这不意味着你前面一定有一个BST吗?至少,这不正是基于BST的“set”数据结构所做的吗?让您检查对数时间内元素的存在性?