澄清Sedgewick"算法" heapsort chapter remark(第4版,第2.4章)

时间:2015-09-14 13:52:19

标签: algorithm heap priority-queue

目前正在阅读Algorithms book。基于优先级队列(p.328)chapter 2.4实施heapsort的Q&部分具有以下段落(让我们关注优先级队列堆,而不是关注堆栈):

  

Q值。我还不清楚优先队列的目的。为什么   我们不是只是排序然后再按顺序考虑这些项目   排序的数组?

     

一个。在一些数据处理示例中,例如TopM和Multiway,   总数量太大,无法考虑排序(甚至   存储在内存中)。如果您正在寻找一个中的前十个条目   十亿项,你真的想要排序一个十亿条目阵列吗?同   优先级队列,您可以使用十项优先级队列。   其他例子,所有数据在任何时候都不存在   及时:我们从优先级队列中取出一些东西,然后处理它,并作为   处理它的结果可能会为优先级添加更多东西   队列中。

TopMMultiway是优先级队列的简单客户端。本书讲述了heapsort的两个阶段:

  1. 堆构造(作者使用优先级队列堆,我们感兴趣)
  2. sortdown
  3. 在我的理解中,堆构造几乎排序("堆顺序")。为了构建堆,您实际上需要访问原始数据集中的每个项。

    问题:任何人都可以说明我在上面的引文中加入粗体的作者的观点?如何在不访问所有项目的情况下构建堆?我想念的是什么?为干杯欢呼。

1 个答案:

答案 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。

相关问题