Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 关于Sedgewick的澄清“;算法“;希普索尔章节备注(第4版,第2.4章)_Algorithm_Heap_Priority Queue - Fatal编程技术网

Algorithm 关于Sedgewick的澄清“;算法“;希普索尔章节备注(第4版,第2.4章)

Algorithm 关于Sedgewick的澄清“;算法“;希普索尔章节备注(第4版,第2.4章),algorithm,heap,priority-queue,Algorithm,Heap,Priority Queue,目前正在阅读。关于基于优先级队列的实现的问答部分(第328页)有以下内容(让我们关注优先级队列堆,而不是heapsort): 我仍然不清楚优先队列的目的。到底为什么 我们不只是排序,然后考虑在增加顺序的项目? 排序数组 A.在一些数据处理示例中,如TopM和Multiway 数据总量太大,无法考虑排序(甚至)。 存储在内存中)。如果你想在一个 十亿项,您真的要对十亿项数组进行排序吗?具有 对于优先级队列,您可以使用10个条目的优先级队列执行此操作。In 在其他示例中,所有数据在任何时候都不存在

目前正在阅读。关于基于优先级队列的实现的问答部分(第328页)有以下内容(让我们关注优先级队列堆,而不是heapsort):

我仍然不清楚优先队列的目的。到底为什么 我们不只是排序,然后考虑在增加顺序的项目? 排序数组

A.在一些数据处理示例中,如TopM和Multiway 数据总量太大,无法考虑排序(甚至)。 存储在内存中)。如果你想在一个 十亿项,您真的要对十亿项数组进行排序吗?具有 对于优先级队列,您可以使用10个条目的优先级队列执行此操作。In 在其他示例中,所有数据在任何时候都不存在 及时:我们从优先级队列中取出一些东西,处理它,然后作为 处理它的结果可能会给优先级增加更多的内容 排队

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

  • 堆构造(作者使用我们感兴趣的优先级队列堆)
  • 腐烂
  • 在我的理解中,堆构造几乎是排序(“堆顺序”)。为了构建堆,您实际上需要访问原始数据集中的每个项目


    问题:有人能说明我在上面引用的粗体的作者的观点吗?如何在不访问所有项的情况下构建堆?我错过了什么?为clarif干杯。

    当然,您必须访问所有参赛作品。光是拜访他们就要花很多时间。但是对它们进行排序通常需要O(n logn)时间。正如作者所说,你不必把所有的分类。只有十大要素。基本程序如下所示:

    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
    

    这里的基本要点是,一旦知道元素不在top-t条目中,就从队列中删除它们。因此,插入和交换不需要O(logn)时间,而只需要O(logt)。这将总时间从O(n logn)减少到O(n logt),其中logt通常比logn小得多。

    Nico,thx for code+您简单的O()推理给了我缺少的部分:作者基本上谈到了无限“管道处理”,比如:值流->有界优先级队列,它是O(n),是对O(NlogN)这样的复杂性的一种胜利。因此,我们基本上使用优先级队列作为“转换”来获取顶级t元素……简短的版本是堆适合于外部操作,即使用磁盘或磁带;此外,堆与堆不是一回事。Heapsort在概念上形成一个堆,然后弹出每个项目。例如,对于前N项,您只需要弹出前N项。