为什么人们强调堆用于实现优先级队列,因为在最大/最小值处偷看的时间复杂度为O(1)。
通过使用指向最右侧/最左侧节点的指针,也不能在bst上轻松实现。
答案 0 :(得分:4)
鉴于您建议基于BST的优先级队列,我将尝试解释为什么堆比BST更好。
堆是一棵完整的树;它是一棵完美平衡的树。它的高度为log_2(n+1)
。
如果这个方法是平衡的,那么BST方法是值得的。用于维持BST平衡的最着名的技术是AVL树。这种树的高度为1.44 log_2(n+2) - 0.33
。
对于最低限度的咨询,BST的成本为O(log(n))
而堆的成本为O(1)
。因此,对于此操作,堆显然更好。
对于插入和删除,成本是渐近等价的。但是BST往往更昂贵,因为它的高度往往高于完美平衡的树。此外,AVL树比堆消耗更多的恒定时间。在AVL(以及其他平衡方法,红黑树,treaps,splays等)中,您执行旋转,而使用堆执行交换,这比轮换更便宜。
BST上的删除操作是一项复杂而且不断进行的操作,可能需要O(log(n))
次轮换。堆是O(log(n))
交换,这种召回比旋转更便宜。
最后,在插入的情况下,您可以为堆执行O(log(n))
交换,并为AVL执行最多两次轮换。但是插入AVL后需要执行不成功的搜索,而堆可以在开始交换之前直接插入新密钥。我认为只有插入一个BST有时会打败一堆。但是,请注意,您很可能会使用优先级队列进行协商和删除;所以,如果是这种情况,那么你肯定会恢复你进行插入时可能失去的时间。
此外,如果使用存储完整树的级别遍历的数组,则堆实际上比BST更容易实现。在这种情况下,您不需要指针
答案 1 :(得分:0)
它可以,但是作为堆执行它更有效,并且可以说更简单,因为堆的顶部比树的最左边的元素更容易跟踪(堆的顶部只是第一个元素)基础序列)。