Skip to content

模型Model

优先队列

Priority queue · Priority queue ADT

按键的优先次序反复访问并移除当前最小元素的抽象数据类型。

形式陈述 ​

最小优先队列是一种抽象数据类型:每个元素带有来自全序键空间的优先级,核心操作为 insert(x,k)、find-min() 与 extract-min(),分别插入带键元素、读取最小键元素、读取并删除最小键元素。算法还可能要求 decrease-key(h,k')、delete(h) 或 meld(Q_1,Q_2);这些操作需要什么句柄、是否允许重复键、空队列如何报告,都属于接口规格。最大优先队列只需反转键的次序。

同一接口可由不同表示实现,下表给出容量足够且删除不触发缩容时的典型最坏时间;有序数组把最小元放在便于从末端删除的一侧,二叉堆的 decrease-key 已知目标位置。若用倍增动态数组,触发扩容的单次插入还需 Θ(n) 搬迁;表中的无序数组常数插入与堆对数插入,此时分别成为摊还界,不能仍称逐次最坏界。

实现 insert find-min extract-min decrease-key
无序数组 O(1) O(n) O(n) O(1)(有句柄)
有序数组 O(n) O(1) O(1) O(n)
二叉最小堆 O(log⁡n) O(1) O(log⁡n) O(log⁡n)

这些复杂度描述实现而非 ADT 本身;接口只规定可观察行为,除非成本界被明确写入规格。

直觉

优先队列接口只要求选出“现在最该处理谁”,并不要求暴露完整排序;具体实现仍可以使用有序数组或搜索树。普通队列按到达时间服务,优先队列按键服务;两个元素键相同时,谁先出来通常没有默认保证,除非接口另外要求稳定性。它也不是二叉堆的同义词:堆是一种实现,正如数组或平衡树也可实现同一组操作。把接口与表示分开,才能根据工作负载选择结构——插入极多而只在末尾取一次最小值时,无序数组可能比堆更合适。

这一抽象尤其适合“候选会不断出现,但每一步只需要当前最好者”的算法。它避免提前为尚未需要的相对次序付费,又把取最优候选的规则集中在一个接口中。

优先队列操作的连续状态
例子与边界

在非负权图的 Dijkstra 算法中,队列元素是尚未定型的顶点,键是当前暂定距离。每轮 extract-min 取出距离最小的顶点;松弛一条边若降低了邻点距离,具有句柄的实现可调用 decrease-key。此时键不是顶点固有属性,而是算法状态的一部分,随着松弛逐步减小。

若库的优先队列没有 decrease-key,可在距离降低时插入一条新记录,取出记录时再检查它是否等于当前距离;旧记录成为惰性丢弃项。这仍能得到正确的 Dijkstra 实现,但队列中会同时存在同一顶点的多个版本,操作次数与空间上界也随之改变,不能把它当作原接口的零成本替换。

例如顶点 v 初次得到距离 10,队列存入 (10,v);后来经另一条路径改进为 4,再插入 (4,v)。先取出 (4,v) 时处理其出边,最终取出 (10,v) 时发现 10≠d[v],直接跳过,不再扫描出边。有效性判断依赖外部的当前距离表,单凭堆内记录无法知道哪个版本过时。在一般含平行弧的图中队列规模可达 O(m),用二叉堆的相应成本应按 log⁡(m+1) 计,而非不加说明地替换为 log⁡n。

有句柄的版本则让每个活动元素对应唯一记录。堆上交换两个元素后必须同时更新“句柄到位置”的映射,否则下一次减键会修改别的元素。元素身份、优先级和当前存储位置是三个不同对象,接口把它们区分开,才能正确支持可变优先级。

优先级相同不意味着先进先出。若任务调度必须在同优先级内保持提交顺序,可把键扩展为 (priority, sequence_number),或要求稳定优先队列。另一个边界是偏序键:若某些键不可比较,find-min 可能有多个互不支配的候选;本页的单一最小元接口依赖全序,偏序前沿需要另一个 ADT。

推论与应用

实现选择取决于操作频率和存储层。Fibonacci 堆把合并与插入延迟化,在摊还意义下提供常数 insert、meld 和 decrease-key;Pairing Heap保留简单的配对合并,但理论界与 Fibonacci 堆不完全相同;外存优先队列则以批量缓冲和块传输降低 I/O,而不追求每个操作的 RAM 指令数。把上层算法的操作次数与实现的单次成本结合,才能得到总复杂度。

二叉堆以紧凑数组和堆序实现常用的对数时间版本。Dijkstra 与 Prim 算法的复杂度会随优先队列实现改变;扫描线则用它按坐标管理尚未发生的几何事件。

若算法需要频繁合并队列,meld 的成本会成为选择二项堆等结构的理由;若只需小规模固定键域,桶或原生数组可能已经足够。

Radix heap专门接受不小于最后弹出值的非负整数键,允许插入顺序下降到该界而不要求全程插入非降。它借XOR最高差异位分桶;普通表示的push/pop不能未经补证就继承任意减键、合并或peek接口。Dial环形桶还利用活动键窗口宽C,用C+1槽保留真实绝对距离。

参考资料
  • Thomas H. Cormen, Charles E. Leiserson, Ronald L. Rivest, and Clifford Stein, Introduction to Algorithms, 4th ed., MIT Press, 2022,Ch. 6, heaps and priority queues。
  • Erik D. Demaine、Srini Devadas、Nancy Lynch, MIT 6.046J Design and Analysis of Algorithms, Spring 2015,课程讲义;优先队列操作与实现取舍,访问于 2026 年。
关系图谱27 个相邻概念 · 5 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
分类位置
类型化关系