“其中下界使用比较模型的信息计数,上界由多路外归并排序达到。在本页 $N M$ 的范围内,对数本已大于一;保留 $\max{1,\cdot}$ 是为了标明扩展到可驻留内存的非空输入时仍需扫描。”
形式陈述
I/O 上界
在外存模型中,输入是外存中连续存放的
这里把不足一块和内存可容纳的输入也包括在内;空输入单独直接返回。大规模
外归并先生成内存大小的有序段,再一次合并
直觉
外归并排序的关键不是减少比较,而是让每一趟都顺序搬完整块,并用内存同时供给尽可能多的输入 run。内存能容纳约
例子与边界
边界
公式抽象了随机 I/O、CPU 比较与设备并行,不能直接预测 SSD 常数。Distribution sort 需要键分布/分桶条件。
CPU 的
下界按块能区分的排列数计数;若键宇宙允许 radix 或 distribution 技巧,纯比较 I/O 下界需要重新审视。稳定性也须在归并相等键时显式保留原先次序。
Run 生成与多路归并
每次读入
例如
排序公式的推导
设初始 run 数为
当
便得到前述排序量级。常数内存比例及各轮最后不足一块的部分不会改变此界。
推论与应用
在不知道具体块大小
实现与模型边界
同键稳定归并要优先较早 run 中记录。Replacement selection 可生成平均更长 runs,却依输入分布;distribution sort 利用键结构,不受纯比较下界同样约束。SSD 并行、预取和 CPU 比较改变常数,但不会让随机单项访问自动等于块扫描。
四帧九页的逐趟账本与下游融合
为把渐近式落实为精确页数,另取9页定长记录、4个数据帧,控制游标另计。初始run生成每次原位排序至多4页,再从已有帧写出,形成长度4、4、1页的三个run。读9写9,成本18。归并用三帧分别缓冲三个run,一帧输出;最小头项每次从其run移除,输出序列始终是已消耗项的有序排列。再读9写9,合计36次I/O,保留每一份重复记录。
再取13页、仍为4帧与三路归并:初始4、4、4、1页四个run,下一趟合成12页和1页两个run,再下一趟合成13页。若采用每趟完整读写、连未参与多路合并的单run也复制的明确调度,三趟共2×13×3=78次I/O。允许把单run原样保留可省其复制,但那是另一个需要逐文件记账的调度,不能把优化后的数字套进完整趟公式。
若消费者可以立即按该键做分组聚合,最终归并不必把9页有序文件写盘再读回:将归并输出直接交给消费者,外排阶段成本变为初始18加最后读9,即27,另计聚合输出。相对于“完整排序36再扫描9”,省去18次临时I/O。消费者只维护当前键及固定大小聚合状态,并能在原输出帧中形成摘要;若它还需更多同时驻留的数据帧,就必须重新分配,不能一边使用三路归并四帧,一边另借一帧。
排序归并连接也可尝试最后归并趟融合,但两侧各有多个run时,需要同时保留两侧输入缓冲、重复键组与输出。两次排序各自有四帧并不意味着融合连接仍只用四帧。DB-4选择先把两输入各物化成一个run,再按两游标、一重复组、一输出的四帧调度,避免隐藏额外缓冲。
参考资料
- Aggarwal, Vitter, “The Input/Output Complexity of Sorting,” CACM, 1988.
- Jeffrey Vitter, Algorithms and Data Structures for External Memory, 2008.
- CMU 15-445/645 Fall 2025,Sorting & Aggregation Algorithms,§§2–3:多路归并与聚合;四帧九页账本为本文自定。