这是破解编码面试中的另一个问题,我看完后仍然有些疑问。
9.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 的大小限制时,它应该告诉你一些事情——在这种情况下,它表明他们不希望你将所有数据都带入内存。那么我们该怎么办?我们只将部分数据带入内存。算法:
我们有多少内存可用?假设我们有 X MB 可用内存。
将文件分成 K 个块,其中 X * K = 2 GB。将每个块放入内存并像往常一样使用任何 O(n log n) 算法对行进行排序。将这些行保存回文件。
现在将下一个块放入内存并排序。
完成后,将它们一一合并。
上述算法也称为外部排序。第 3 步称为 N 路合并 使用外部排序的基本原理是数据的大小。由于数据太大,我们无法将其全部放入内存,因此我们需要使用基于磁盘的排序算法。
怀疑:
在第 3 步进行归并排序时,在比较 2 个数组时,每次比较是否需要 2*X 空间?限制是 X MB。我们应该把块做成 (X/2)*2K = 2GB 吗?这样每个块将是 X/2 MB 并且将有 2K 块。或者我只是理解合并排序错误?谢谢!