优先队列: 基本操作:插入 删除(删除最小元素)
目标:为上述功能提供有效的运行时间或增长顺序。
优先级队列的实现方式:
Linked List: Insertion will take o(n) in case of insertion at end o(1) in case of
insertion at head.
Delet (Finding minumum and Delete this ) will take o(n)
BST:
Insertion/Deltion of minimum = In avg case it will take o(logn) worst case 0(n)
AVL Tree:
Insertion/deletion/searching: o(log n) in all cases.
我的困惑在这里:
为什么我们没有使用AVL Tree来实现优先队列,为什么我们走了 for Binary heap ...虽然我们知道在AVL Tree中我们可以在最坏的情况下在o(log n)中进行插入/删除/搜索。
答案 0 :(得分:3)
复杂性并非一切,实际表现还有其他考虑因素。
对于大多数用途,大多数人甚至不使用AVL树作为平衡树(就我所见,红黑树更常见),更不用说作为优先级队列了。
这并不是说AVL树没用,我非常喜欢它们。但它们确实有相对昂贵的插入物。什么AVL树有利于(甚至击败红黑树)正在进行大量的查找而无需修改。这不是优先级队列所需要的。
作为一个单独的考虑因素 - 别担心你的二进制堆的O(log n)插入,斐波那契堆有O(1)插入和O(log N)删除最小。有很多数据结构可供选择,权衡略有不同,所以你不会期望每个人都选择满足你(非常简短)标准的第一件事。
答案 1 :(得分:3)
二进制堆不是二进制搜索树(BST)。如果严重不平衡/恶化成一个列表,它确实需要O(n)时间。堆通常总是O(log(n))或更好。 IIRC Sedgewick声称O(1)平均时间基于阵列堆。
为什么不AVL?因为它在结构中维护 太多订单 。订单太多意味着,维护该订单需要付出太多努力。我们可以获得的订单越少越好 - 它通常会转换为 更快的操作 。例如,RBT优于AVL树。 RBT,红黑树,几乎平衡树 - 它们保存操作,同时仍然确保O(log(n))时间。
但是任何树都是完全有序的结构,所以堆通常更好,因为它们只能确保最小元素在顶部。它们只是部分订购。
答案 2 :(得分:2)
因为在二进制堆中,最小元素是根。