【问题标题】:Clarification on Sedgewick "Algorithms" heapsort chapter remark (4 ed, chapter 2.4)Sedgewick“算法”堆排序章节备注的澄清(第 4 版,第 2.4 章)
【发布时间】:2015-12-10 13:26:42
【问题描述】:

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

问。我仍然不清楚优先队列的目的。究竟为什么 难道我们不只是排序,然后按升序考虑项目吗? 排序后的数组?

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

TopM、Multiway 是优先队列的简单客户端。本书讲述了堆排序的两个阶段:

  1. 堆构建(作者使用优先队列堆,我们感兴趣)
  2. 排序

在我的理解中,堆构建是几乎排序(“堆顺序”)。为了构建一个堆,您实际上需要访问原始数据集中的每个项。

问题:谁能说明我在上面引用中粗体所写的作者观点?我们如何在不访问所有项目的情况下构建堆?我在这里想念什么?为 clarif 干杯。

【问题讨论】:

  • 简短的版本是堆适用于外部操作——即使用磁盘或磁带;此外,堆与堆排序不同。 Heapsort 在概念上创建一个堆,然后弹出每个项目。例如top N,只需要弹出top N项即可。

标签: algorithm heap priority-queue


【解决方案1】:

当然,您必须访问所有条目。光是拜访他们就需要 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

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

【讨论】:

  • Nico,谢谢你的代码 + 你简单的 O() 推理给了我缺失的部分:作者基本上谈到了无限 “管道处理”,例如:值流 -> 有界优先级队列 这是 O(n) 并且是对 O(NlogN) 等复杂性的胜利。所以我们基本上使用优先队列作为“转换”来获取top t元素...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-08
  • 1970-01-01
  • 2018-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多