Data structures 二进制堆对于优先级队列的优势?

Data structures 二进制堆对于优先级队列的优势?,data-structures,heap,quicksort,priority-queue,Data Structures,Heap,Quicksort,Priority Queue,我似乎忽略了一件非常简单的事情:与快速排序的值数组相比,优先级队列的二进制堆有什么优势?在这两种情况下,我们都在数组中保留值,insert是O(logN),delete max是O(1)。在这两种情况下,给定元素数组的初始构造都是O(NlogN),尽管链接建议使用更快的Floyd算法来构造二进制堆。但是在队列的情况下,元素可能会一个接一个地被接收,因此这种优势就消失了。此外,对于二进制堆,merge的性能似乎更好。 那么,除了合并之外,还有什么理由选择伯克希尔哈撒韦?也许我的假设是错误的,BP只

我似乎忽略了一件非常简单的事情:与快速排序的值数组相比,优先级队列的二进制堆有什么优势?在这两种情况下,我们都在数组中保留值,insert是O(logN),delete max是O(1)。在这两种情况下,给定元素数组的初始构造都是O(NlogN),尽管链接建议使用更快的Floyd算法来构造二进制堆。但是在队列的情况下,元素可能会一个接一个地被接收,因此这种优势就消失了。此外,对于二进制堆,merge的性能似乎更好。
那么,除了合并之外,还有什么理由选择伯克希尔哈撒韦?也许我的假设是错误的,BP只用于学习目的。我检查了C++文档,他们提到了“堆”,但当然它并不意味着二进制堆。 有点类似的问题:

如果有向下投票,请解释一下-我真的很想理解这一点。

二进制堆的主要优点是,您可以在最初构建它之后高效地向它添加新值。假设您想使用排序数组备份优先级队列。如前所述,如果队列中的所有值都是已知的,则可以对这些值进行排序。但是,当您希望向优先级队列添加新值时会发生什么情况?在最坏的情况下,这可能需要时间Θ(n),因为必须向下移动所有数组元素,以便为刚刚添加的新元素留出空间。另一方面,插入二进制堆需要时间O(logn),这是指数级的速度

在排序数组上使用堆的另一个原因是,如果您只需要将几个元素出列。正如您所提到的,对数组进行排序需要时间O(n logn),但使用巧妙的算法可以在时间O(n)内构建堆。如果需要构建优先级队列并从中保留k个元素,其中k事先未知,则具有排序数组的运行时为O(n logn+k),具有二进制堆的运行时为O(n+k logn)。对于小k,第二种算法要快得多


希望这有帮助

实际上,这里有很多问题都提到了二叉树作为PQ实现。另一个问题比较了堆和二叉树:但是这个问题的答案在这里都不相关。@templatetypedef抱歉,我犯了一个错误:对于BH,delete max是O(logN),我的意思是find max是O(1)。我读了你的答案才意识到。谢谢!我会为Θ(n)的用法加上另一个+1。我还有一个问题。当我问最初的问题时,我错过了那个转变的部分。但是shift可以针对排序数组进行优化吗?在这种情况下,只需移动一个相邻的块,而不是用O(logN)交换一个BH。如果您有一个n元素数组,并且需要在其中插入一个元素,那么即使列表已排序,您也需要移动n/2个元素以腾出空间。除非您从使用阵列切换到其他数据结构,否则无法避免支付此成本。