外排序
外排序是一种处理海量数据的排序手段,在不爆内存的前提下完成大量数据的排序处理。以下面CTCI的一道题为例:
题目:如果你有个2GB的文件,其中每一行是一个字符串,你会使用哪种算法来排序,为什么?
解答:显然不可能一次性将该文件读入内存,然后来个qsort, heap_sort。于是想到利用硬盘(外存储)。
1. 读100M from 2GB,写到某个临时文件,如1.dat。循环此步,直到将2GB文件拆分成1.dat、2.dat、``` 21.dat;
2. 拿100M内存来实施这个归并排序。将这100M的内存拆分 (21 + 1) 份,其中“21”对应为输入缓冲区,
"1"对应输出缓冲区;
3. 21个输入缓冲区各自插个管子到21个dat,1个输出缓冲区插个管子到写出文件(sorted);
4. 分别从1.dat~21.dat 读入数据将 21 个输入缓冲区填满,阔以联想开闸放水。对这21个输入缓冲区的数据多路 归并,结果放入输出缓冲区;
5. 哪路输入缓冲区空了就再从对应.dat文件读满,输出缓冲区满了就写出结果文件;
6. .dat文件读空了就拔掉管子,21个.dat文件都拔掉管子后,将输出缓冲区里的数据全部写出(如果有);
7. 完毕。