比如有这样一个基于真实场景的经典面试题:假设现在有 1TB 的任意文本,请问如何能将其中出现的单词按照字母序排列,得到一个新的文本?
这个问题的关键点其实在于,内存是有限的,而所谓外部排序的这个外:指的是外部存储。
已知1GB的内存如果要处理1TB,至少要读1024次。
所以大体思路一定是:将文件分段,用常见内部排序方法进行排序完了之后,再合并。即思路上大体是归并排序
主要影响因素
1.内部排序
我们分成一段一段之后,主要目的是使得内存能够装下这一段数据。
一般来说,快速排序在大部分场景下都是最快的
2.归并阶段
因为需要归并n多个段,此时的内存肯定无法装下超过一个段的内容。此时最大的时间消耗来自IO。
内存的读写操作是很快的,但是外部磁盘中读写,可能比内存中要慢非常非常多。
我们看这个教程中的图片。每一次的归并,我们都得从外存中读。所以IO次数和归并层数成正比
3.如何降低归并层数——增加归并路数k
那就得每次多归并几段,上图这种每次归并两段,就是两路归并