目前正在阅读Algorithms book。基于优先级队列(p.328)chapter 2.4实施heapsort的Q&部分具有以下段落(让我们关注优先级队列堆,而不是关注堆栈):
Q值。我还不清楚优先队列的目的。为什么 我们不是只是排序然后再按顺序考虑这些项目 排序的数组?
一个。在一些数据处理示例中,例如TopM和Multiway, 总数量太大,无法考虑排序(甚至 存储在内存中)。如果您正在寻找一个中的前十个条目 十亿项,你真的想要排序一个十亿条目阵列吗?同 优先级队列,您可以使用十项优先级队列。 其他例子,所有数据在任何时候都不存在 及时:我们从优先级队列中取出一些东西,然后处理它,并作为 处理它的结果可能会为优先级添加更多东西 队列中。
TopM,Multiway是优先级队列的简单客户端。本书讲述了heapsort的两个阶段:
在我的理解中,堆构造几乎排序("堆顺序")。为了构建堆,您实际上需要访问原始数据集中的每个项。
问题:任何人都可以说明我在上面的引文中加入粗体的作者的观点?如何在不访问所有项目的情况下构建堆?我想念的是什么?为干杯欢呼。
答案 0 :(得分:3)
当然,您必须访问所有条目。只是访问他们需要O(n)时间。但是对它们进行排序通常需要O(n log n)时间。正如作者所述,你不必对所有这些进行排序。只有十大元素。基本程序如下:
allocate priority queue q with space for t entries
visit each entry e in the input array
queueIsFull := size(q) == t
if !queueIsFull || e > min(q)
if !queueIsFull
insert e into q
else
exchange min(q) with e and bubble up
next
这里的基本要点是,只要您知道它们不在前面的条目中,就会从队列中删除元素。因此,插入和交换不需要O(log n)时间,而只需要O(log t)。这减少了从O(n log n)到O(n log t)的总时间,其中log t通常远小于log n。