Algorithm 用AVL树数据结构实现优先级队列

Algorithm 用AVL树数据结构实现优先级队列,algorithm,data-structures,Algorithm,Data Structures,优先级队列: 基本操作:插入 删除(删除最小元素) 目标:为上述功能提供高效的运行时间或增长顺序 优先级队列的实现方式: 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

优先级队列: 基本操作:插入 删除(删除最小元素)

目标:为上述功能提供高效的运行时间或增长顺序

优先级队列的实现方式:

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.
我的困惑在这里:

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树来实现优先级队列,为什么我们不这样做
对于二进制堆…正如我们所知,在AVL树中,在最坏的情况下,我们可以在o(log n)中进行插入/删除/搜索。

因为在二进制堆中,最小的元素是根

复杂性不是一切,实际性能还需要考虑其他因素

在大多数情况下,大多数人甚至不使用AVL树作为平衡树(就我所见,红黑树更常见),更不用说作为优先级队列了

这并不是说AVL树是无用的,我很喜欢它们。但它们的插入物确实相对昂贵。AVL树的好处(甚至比红黑树都好)是在没有修改的情况下进行大量查找。这不是优先级队列所需要的


作为一个单独的考虑因素——不要在意二进制堆的O(logn)插入,fibonacci堆具有O(1)插入和O(logn)删除最小值。有很多数据结构可供选择,但它们之间的取舍略有不同,因此您不希望看到每个人都只选择满足您(非常简短)标准的第一件事。

二进制堆不是二进制搜索树(BST)。如果严重失衡/恶化到列表中,则确实需要O(n)时间。堆通常总是O(log(n))或更好。IIRC Sedgewick声称基于阵列的堆的平均时间为O(1)

为什么不是AVL?因为它在结构中保持了太多的顺序。太多的秩序意味着,在维持秩序方面付出了太多的努力。我们能处理的订单越少越好-它通常会转化为更快的操作。例如,RBT比AVL树更好。RBT,即红黑树,几乎是平衡树——它们在保证O(log(n))时间的同时节省了操作


但是任何树都是完全有序的结构,所以堆通常更好,因为它们只确保最小元素位于顶部。它们只是部分订购。

我感谢你的回答,史蒂夫,并向你表示感谢,但就我的问题而言,我只是不想知道为什么我们会选择二进制堆……我知道在每个定理/发明背后都隐藏着一些点,我只是想知道时间复杂性……我认为时间复杂性是决定和选择数据的主要因素之一structure@Nishant:你不会找到答案的仅就复杂性而言,因为正如您所注意到的,AVL树和二进制堆的复杂性是相同的。当二进制堆比AVL树(或者更小)快时,人们会选择它。复杂性!=速度。你的评论回答了我的问题…非常感谢。祝你过得愉快steve和willness非常感谢你。此外,可以使用数组[]而不是节点/指针来实现二进制堆,这使大多数操作更快。+1,“维护太多的顺序”“这是一个很好的方式来表达为什么一棵树被过度杀戮了。”史蒂夫耶索普我想费曼有一本书,他在书中用熵等概念研究了CS。虽然我还没有读过。)@威尔和史蒂夫:在二进制堆中,我们还必须维护结构属性和堆顺序属性,就像我们在AVL中为balance@Nishant堆中的顺序比树中的顺序少。如果你按顺序遍历一棵树,你会得到一个有序的列表。但如果对堆进行预排序遍历,则不会得到排序列表。在heap中,左右分支可以自由交换。在树中不是这样。@WillNess:对于堆中的维护顺序,时间复杂度是O(logn)。意志力我认为就复杂性而言,我们无法比较AVL和二进制堆。我们必须考虑速度。我认为使用二进制堆的原因是算法的速度,而不是共变性…例如,就增长顺序而言,1000log(n)仍然是log(n)是一样的,但在速度方面两者都不一样1.如果我不一样,请纠正我wrong@UmNyobe:就grwoth的顺序而言,它是相同的。但就速度而言是不同的……优先级队列不仅仅是
peek
。还有
pop
insert
,有时还有
popanderinsert
。我没有提到peek。根据定义,二进制堆节点比其子节点小。只是这个属性应该引起警报。