题目
原文:
If you have a 2 GB file with one string per line, which sorting algorithm would you use to sort the file and why?
译文:
你有2GB的文件,其中每行一个字符串,你会使用哪种排序算法来排序,为什么?
解答
2GB的文件肯定不会一次性载入内存,所以可以分次载入内存;
而我们一般提到排序都是指内排序,比如快速排序,堆排序,归并排序等,所谓内排序就是可以在内存中完成的排序。RAM的访问速度大约是磁盘的25万倍,我们当然希望如果可以的话都是内排来完成。但对于大数据集来说,内存是远远不够的,这时候就涉及到外排序的知识了。
外部排序指的是大文件的排序,即待排序的记录存储在外存储器上,待排序的文件无法一次装入内存,需要在内存和外部存储器之间进行多次数据交换,以达到排序整个文件的目的。外部排序最常用的算法是多路归并排序,即将原文件分解成多个能够一次性装人内存的部分,分别把每一部分调入内存完成排序。然后,对已经排序的子文件进行归并排序。
算法:
首先我们要了解,可以用的内存有多大?假设我们有X MB的内存可用。
1.我们将文件分为K份,其中X*K=2GB。每次取其中一份载入到内存中, 用O(nlog n)的算法排序,然后再保存到外部文件。
2.载入下一份并排序
3.当我们将K份小文件都排好序,合并它们。
上面的算法就是外排序,步骤3又称为N路归并。
使用外排序是由于数据太大了,无法一次全部加载到内存中,所以需要借助磁盘进行存储, 每次只从磁盘中加载一部分数据进入内存,进行排序。
推荐阅读: 维基百科:外排序
参考:http://hawstein.com/posts/9.4.html
---EOF---