Cracking the coding interview--Q9.4

题目

原文:

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---

你可能感兴趣的:(Cracking the coding interview--Q9.4)