我想知道我们是否可以使用二叉搜索树来模拟堆操作(插入,找到最小值,删除最小值),即使用BST来执行相同的工作?
这样做有什么好处吗?
答案 0 :(得分:4)
当然可以。但是BST平衡。
最小值是leftest元素。最大值是最正确的元素。在修改数据结构之后,每个O(logn)
找到这些元素,并且可以在每次插入/删除时缓存[注意,这里有优化空间,但这种天真的方法也不会与复杂性要求相矛盾!] < / p>
这样你就可以插入,删除:O(logn)
,findMin / findMax:O(1)
修改强>
我在这个实现中可以想到的唯一优势是你在一个数据结构中同时得到findMin,findMax。
但是,这个解决方案会慢得多[每步更多操作,预计会有更多缓存未命中...]并且比基于常规数组的堆实现消耗更多空间。
答案 1 :(得分:3)
是的,但您丢失了O(1)
堆的平均插入
正如其他人提到的,您可以使用BST来模拟堆。
然而,这有一个主要的缺点:你失去了O(1)插入平均时间,这基本上是首先使用堆的唯一原因:https://stackoverflow.com/a/29548834/895245
如果要跟踪堆上的最小值和最大值,我建议您使用两个堆而不是BST来保持O(1)插入优势。
答案 2 :(得分:0)
是的,我们可以通过简单地在BST中插入并找到最小值。但是,由于在整个树中强制执行更严格的排序,因此查找将花费O(log n)时间并且其他函数会受到类似的惩罚,因此几乎没有什么好处。
答案 3 :(得分:0)
基本上,我同意@amit的回答。我将详细介绍这个修改后的BST的实施情况。
堆可以在O(1)中执行findMin
或 findMax
,但不能在同一数据结构中执行。稍作修改,BST就可以在O(1)中执行 findMin
和 findMax
。
在此修改后的BST中,每次执行可能修改数据结构的操作时,都会跟踪最小节点和最大节点。例如,在插入操作中,您可以检查最小值是否大于新插入的值,然后将最小值分配给新添加的节点。可以对最大值应用相同的技术。因此,此BST包含这些信息,您可以在O(1)中检索它们。 (与二进制堆相同)
在此BST(特别是平衡BST)中,当您pop min
或pop max
时,要分配的下一个最小值是最小节点的后继,而要分配的下一个最大值是最大节点的前任。因此它在O(1)中执行。感谢下面的@JimMischel评论,但是我们需要重新平衡树,因此它仍然会运行O(log n)。 (与二进制堆相同)
在我看来,一般Heap可以被Balanced BST取代,因为BST在几乎所有的堆数据结构中都能表现得更好。但是,我不确定Heap是否应被视为过时的数据结构。 (你怎么看?)
PS:必须交叉引用不同的问题:https://stackoverflow.com/a/27074221/764592