使用Ruby作为脚本语言,使用4gb内存的计算机对30gb字符串进行排序的最佳方法是什么?
嗨,我把这看作是一个面试问题,并认为这是一个有趣的问题,我不确定答案使用Ruby作为脚本语言,使用4gb内存的计算机对30gb字符串进行排序的最佳方法是什么?,ruby,algorithm,sorting,theory,Ruby,Algorithm,Sorting,Theory,嗨,我把这看作是一个面试问题,并认为这是一个有趣的问题,我不确定答案 最好的方法是什么?将它们放在数据库中,让数据库担心它。假设*nix: system("sort <input_file >output_file") 系统(“排序输出文件”) “排序”可以使用临时文件处理大于内存的输入文件。如果需要的话,它有开关来调整主内存的数量和它将使用的临时文件的数量 如果不是*nix,或者面试官因为侧着脸回答而皱眉,那么我将编写一个外部代码。有关外部排序算法的详细总结,请参见@psyho
最好的方法是什么?将它们放在数据库中,让数据库担心它。假设*nix:
system("sort <input_file >output_file")
系统(“排序输出文件”)
“排序”可以使用临时文件处理大于内存的输入文件。如果需要的话,它有开关来调整主内存的数量和它将使用的临时文件的数量
如果不是*nix,或者面试官因为侧着脸回答而皱眉,那么我将编写一个外部代码。有关外部排序算法的详细总结,请参见@psyho的答案。数据库系统已经很好地处理了这个特定问题
一个很好的答案是使用合并排序算法,根据合并步骤的需要对其进行调整,以使其适用于从磁盘到磁盘的假脱机数据。这可以用最少的内存来完成。好吧,这是一个有趣的面试问题。。。几乎所有这类问题都是为了测试你的技能,幸运的是,它们并不直接适用于现实生活中的例子。这看起来像一个,让我们进入谜题 当你的面试官要求“最好”时,我相信他/她只谈论表现 答复1 30GB的字符串代表大量的数据。所有比较交换算法都是
Omega(n logn)
,因此需要很长时间。虽然有O(n)
算法,比如计数排序,但它们并不合适,因此您将乘以30GB,而您只有4GB的RAM(考虑交换量…),因此我将使用快速排序
答复2(部分)
开始考虑计数排序。您可能希望首先将字符串分组(使用基数排序方法),每个字母一个。您可能需要扫描该文件,并且对于每个首字母,将字符串移动到一个临时文件中(以便复制和删除,不浪费空间)。您可能希望对每个字符串的前2、3或4个字符重复该过程。然后,为了降低对大量文件进行排序的复杂性,您可以分别对每个文件中的字符串进行排序(现在使用快速排序),最后按顺序合并所有文件。这样,您仍然会有一个
O(n logn)
,但在较低的n
上,一种方法是使用:
听起来像是一个分而治之的算法,结果存储在不同的文件中,然后在最后合并。谢谢你,这正是我认为答案应该是。。。我不知道,尼克斯,但我认为它在某个时候被列在了问题中。