Skip to content

外存排序

External-memory sorting

在 I/O 模型中以块传输而非 CPU 比较次数衡量海量排序。

条目类型
算法

形式陈述

I/O 上界

外存模型中有 N 项、内存容纳 M 项、每块 B 项。扫描代价 Scan(N)=Θ(N/B)比较排序最优量级

Sort(N)=Θ(NBlogM/BNB)

N>M;能装入内存时只需扫描)。

外归并先生成 M 大小有序段,再一次并 Θ(M/B) 路:每路保留一个输入块并留输出块。二路归并会多做不必要的趟数,log 底数正来自并路数。

直觉

归并排序的关键不是减少比较,而是让每一趟都顺序搬完整块,并用内存同时供给尽可能多的输入 run。内存能容纳约 M/B 个输入缓冲,因此一趟可把 run 数缩小同样倍数;这直接形成对数的底数,也解释了二路归并为何浪费外存带宽。

初始 runs 与多路归并
例子与边界

边界

公式抽象了随机 I/O、CPU 比较与设备并行,不能直接预测 SSD 常数。Distribution sort 需要键分布/分桶条件。B,M 以元素还是字节计须一致,tall-cache 假设只在使用它的算法中注明。

CPU 的 O(NlogN) 不能机械换成同阶 I/O;顺序块传输才是外存算法核心。

下界按块能区分的排列数计数;若键宇宙允许 radix 或 distribution 技巧,纯比较 I/O 下界需要重新审视。稳定性也须在归并相等键时显式保留原先次序。

Run 生成与多路归并

每次读入 M 项在内存排序并写出一个 run,共 N/M 个。归并时为每个输入 run 保留一块缓冲、为输出保留一块,故 fan-in 为 Θ(M/B) 而非 M;最小堆选择各缓冲头,块耗尽再读下一块。

例如 N=109,M=106,B=103,初始约 1000 runs,一轮最多并约 1000 路,理想情况下单轮即可归并。二路归并却需约 10 轮,每轮读写全数据,I/O 高一个数量级。

排序公式的推导

每层读写 Θ(N/B) 块,run 数每层缩小 M/B 倍,层数

Θ(logM/BNB),

乘积得到 Sort(N)。若 NM,数据一次装入,公式应截断为 O(N/B),不能出现负对数。

推论与应用

在不知道具体块大小 B 与缓存容量 M、但采用理想缓存假设时,Funnel Sort以递归漏斗归并实现 cache-oblivious 比较排序,并达到排序 I/O 界所要求的渐近扫描效率。它不是任意存储层上的无条件替代:证明依赖块传输、最优替换和 tall-cache 一类模型条件,工程实现还需处理写放大与并发 I/O。

实现与模型边界

同键稳定归并要优先较早 run 中记录。Replacement selection 可生成平均更长 runs,却依输入分布;distribution sort 利用键结构,不受纯比较下界同样约束。SSD 并行、预取和 CPU 比较改变常数,但不会让随机单项访问自动等于块扫描。

参考资料
  • Aggarwal, Vitter, “The Input/Output Complexity of Sorting,” CACM, 1988.
  • Jeffrey Vitter, Algorithms and Data Structures for External Memory, 2008.
关系图谱10 个相邻概念 · 3 类关系

拖动节点调整位置。

显示关系

显示:依赖

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

使用的工具

被这些条目使用

具体实现