外部排序

定义与基本思想

外部排序(External Sorting)是指数据量太大,无法全部装入内存时,借助外部存储(如磁盘)进行的排序。其基本思想是:将大文件分成若干能放入内存的小块,分别排序后再多路归并。

外部排序

点击“执行一步”观察算法状态变化。

常见算法

多路归并排序

  • 将大文件分成若干小块,分别读入内存排序(如归并排序)
  • 将已排序的小块(称为“归并段”)多路归并成大文件
  • 可采用二路、四路或多路归并,减少归并次数

多路归并的实现

外部排序的归并阶段需要从多个归并段中不断选出最小元素。若采用 k 路归并,用败者树可以在 O(log⁡2k)O(\log_2 k) 时间内选出最小元素,减少比较次数。

  • 败者树:锦标赛思想,记录每轮比较的“败者”,根结点为“冠军”(最小元素)。k 路归并每趟选最小只需 O(log⁡2k)O(\log_2 k) 次比较
  • 置换-选择排序:生成尽可能长的初始归并段。内存中维护一个最小堆,每当输出一个最小元素,就从输入文件读入一个新元素替补,从而生成比内存容量更长的归并段,减少归并趟数
  • 最佳归并树:当各归并段长度不等时,用类似哈夫曼树的方法构造最佳归并树,使带权路径(I/O 次数)最小,虚段(空归并段)补零

归并趟数的推导

设初始归并段数为 r,采用 k 路归并,则归并趟数 S=⌈log⁡kr⌉S = \lceil \log_k r \rceil。每趟归并都要读写一遍全部数据,因此减少归并趟数(增大 k 或减少 r)能显著减少磁盘 I/O。

应用场景

  • 大型数据库、搜索引擎日志、海量数据分析等
  • 任何单机内存无法容纳全部数据的排序任务

时间复杂度分析

  • 排序阶段:O(nlog⁡n)O(n\log n)(每块内排序)
  • 归并阶段:O(nlog⁡kn)O(n\log_k n),kk为归并路数
  • 总体复杂度:O(nlog⁡n)O(n\log n)
  • 空间复杂度:主要受磁盘 I/O 和缓冲区大小影响

习题

习题 1

简述外部排序的基本流程及适用场景。

外部排序归并段多路归并磁盘文件

解题思路:

本题考查外部排序的基本流程与适用场景。外部排序处理的是数据总量超出内存容量、必须存放在磁盘外存上的情形,因此标准做法是“内排序 + 外归并”两个阶段。

详细步骤:

  1. 分块排序,生成归并段:把大文件分成若干块,每块读入内存用内排序(如快速排序)排好序后写回磁盘,形成初始归并段。
  2. 多路归并成大文件:同时打开多个归并段,每次从各段读一条记录进行比较归并,直到所有段合并完毕,输出有序文件。
  3. 适用于内存无法容纳全部数据的场景:内排序阶段决定每块的大小,外归并阶段决定同时可归并的路数,整体开销由“块内排序 + 多路归并”两阶段构成。

最终答案:

分块+归并,适合大数据排序。

习题 2

外部排序常用的归并方式有哪些?其复杂度如何?

外部排序多路归并归并路数时间复杂度

解题思路:

本题考查外部排序中归并方式的选择与复杂度分析。归并路数越多,单趟合并处理的归并段越多、总趟数越少,但所需的缓冲区也越多,因此总时间可写成 O(nlog⁡kn)O(n \log_k n)。

详细步骤:

  1. 二路归并:每次合并两个归并段,实现最简单,但归并趟数最多,所需缓冲空间最少。
  2. 四路、多路归并:一次合并 kk 个归并段,归并趟数降为 ⌈log⁡kn⌉\lceil \log_k n \rceil,代价是需要 kk 路缓冲区。
  3. 复杂度分析:总时间复杂度为 O(nlog⁡kn)O(n \log_k n),其中 kk 为归并路数;实际系统通常取与外存块数相当的 kk 来折中速度与缓冲开销。

最终答案:

常用多路归并,复杂度 O(nlog⁡kn)O(n\log_k n)。

发现内容有问题?

告诉我们哪里需要改进。