Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用Ruby作为脚本语言,使用4gb内存的计算机对30gb字符串进行排序的最佳方法是什么?_Ruby_Algorithm_Sorting_Theory - Fatal编程技术网

使用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
上,一种方法是使用:

  • 将一块文件读入内存
  • 使用任何常规排序算法(如快速排序)对该块进行排序
  • 将排序后的字符串输出到 临时文件
  • 重复步骤1-3,直到处理完为止 整个文件
  • 通过以下方式应用合并排序算法: 逐行读取临时文件
  • 利润
    听起来像是一个分而治之的算法,结果存储在不同的文件中,然后在最后合并。谢谢你,这正是我认为答案应该是。。。我不知道,尼克斯,但我认为它在某个时候被列在了问题中。