“实现选择取决于操作频率和存储层。Fibonacci 堆把合并与插入延迟化,在摊还意义下提供常数 、 和 ;Pairing Heap保留简单的配对合并,但理论界与 Fibonacci 堆不完全…”
形式陈述
接口与成本单位
外存优先队列维护键值项,核心支持 insert、find-min 与 delete-min;常见扩展还有 decrease-key 和批量输出。所选外存模型有内存容量
一个可核验的缓冲树版本从空队列开始,执行总共
次 I/O,假设
更小的输入可保留在内存中;若把输入读取、最后写回也计入,统一的保守上界是
不同结构还可能提供依赖最大队列大小的界,或对每一批
直觉
缓冲为何改变吞吐
内部内存二叉堆一次 insert 或 delete-min 最坏沿
外存结构把更新先写入内存或根缓冲。缓冲积累到
内部节点维护分隔键、缓冲范围和必要的最小值摘要。flush 后的结构不变量是:每项仍归属于覆盖其键区间的唯一逻辑路径,父层尚未下推的项与子层已有项共同组成当前集合,任何重复项都不能在两处被重复输出。
delete-min 必须物化输出前沿
insert 可以延迟,delete-min 却必须知道全局最小项。常见设计在靠近输出端维护一个已排序的小批次或最小项缓冲;当它耗尽时,从若干候选缓冲中抽取下一批,合并后只物化最小前缀,其余项留在较高层。
如果一次 refill 输出
例子与边界
海量事件流轨迹
设磁盘上要调度事件
括号首项是时间戳。五次 insert 先进入根缓冲,不逐个访问叶。根缓冲达到阈值后按时间范围分为早、中、晚三批,并以连续块写入对应子结构。
第一次 delete-min 发现输出前沿为空,于是读取早期候选批,将
这条轨迹展示了延迟写入的核心正确性条件:尚未 flush 不等于尚未生效。所有层的缓冲、叶存储与输出前沿共同定义当前优先队列状态。
推论与应用
摊还账本
把一次满缓冲 flush 的
因此得到 Sort 级的摊还主项。delete-min 的 refill 也要把读取、合并与后续写回计入同一摊还账本。
摊还界允许某一次操作触发级联 flush。要求低尾延迟或实时截止期时,应采用去摊还结构并报告最坏界;不能把平均每项的小数 I/O 解释成每次调用都少于一次物理读盘。
适用范围与相邻结构
Buffer Tree提供“积累操作再分组下推”的通用技术,外存优先队列还需保证全局最小端可及时访问。B-tree 擅长点查询和有序范围扫描,逐项 insert 加查最小键并不自动达到同样的批处理界。
重复键需要稳定次序或显式句柄。decrease-key 若旧键无法按句柄定位,可记录删除标记加新键,但 delete-min 必须过滤失效副本并把清理成本计入。内存放不下所有顶层缓冲、键记录跨块、或每个 flush 只写少量项时,
经典 I/O 模型也不包含 SSD 写放大、并发锁、崩溃恢复和操作系统页缓存的双重缓冲。这些是工程层约束,不应悄悄混入或替代块传输复杂度。
参考资料
- Lars Arge, External Memory Data Structures, §5 Theorem 7:从空结构开始的整段更新与 delete-min 界;缓冲树技术最初发表于 WADS 1995。
- Gerth Stølting Brodal and Jyrki Katajainen, Worst-Case Efficient External-Memory Priority Queues, SWAT, 1998.
- Jeffrey Scott Vitter, External Memory Algorithms and Data Structures, ACM Computing Surveys, 2001.