Algorithm 关于Sedgewick的澄清“;算法“;希普索尔章节备注(第4版,第2.4章)
目前正在阅读。关于基于优先级队列的实现的问答部分(第328页)有以下内容(让我们关注优先级队列堆,而不是heapsort): 我仍然不清楚优先队列的目的。到底为什么 我们不只是排序,然后考虑在增加顺序的项目? 排序数组 A.在一些数据处理示例中,如TopM和Multiway 数据总量太大,无法考虑排序(甚至)。 存储在内存中)。如果你想在一个 十亿项,您真的要对十亿项数组进行排序吗?具有 对于优先级队列,您可以使用10个条目的优先级队列执行此操作。In 在其他示例中,所有数据在任何时候都不存在 及时:我们从优先级队列中取出一些东西,处理它,然后作为 处理它的结果可能会给优先级增加更多的内容 排队 ,是优先级队列的简单客户端。这本书讲述了heapsort的两个阶段:Algorithm 关于Sedgewick的澄清“;算法“;希普索尔章节备注(第4版,第2.4章),algorithm,heap,priority-queue,Algorithm,Heap,Priority Queue,目前正在阅读。关于基于优先级队列的实现的问答部分(第328页)有以下内容(让我们关注优先级队列堆,而不是heapsort): 我仍然不清楚优先队列的目的。到底为什么 我们不只是排序,然后考虑在增加顺序的项目? 排序数组 A.在一些数据处理示例中,如TopM和Multiway 数据总量太大,无法考虑排序(甚至)。 存储在内存中)。如果你想在一个 十亿项,您真的要对十亿项数组进行排序吗?具有 对于优先级队列,您可以使用10个条目的优先级队列执行此操作。In 在其他示例中,所有数据在任何时候都不存在
问题:有人能说明我在上面引用的粗体的作者的观点吗?如何在不访问所有项的情况下构建堆?我错过了什么?为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项。