给定一个120GB的硬盘驱动器,其中100个充满了长度为256和2 GB的字符串Ram如何在Java中最有效地对这些字符串进行排序?这需要多长时间?
我基本上是在重复Krystian的回答,但在阐述:
是的,您需要或多或少就地执行此操作,因为您的可用RAM很少。但是,仅仅由于移动字符串的成本,在这里进行幼稚的就地排序将是一场灾难。
而不是实际移动弦乐,只需跟踪哪些弦乐应与其他弦乐交换,并最终将它们一次移动到最终位置。也就是说,如果您有1000个字符串,请组成一个1000个整数的数组。array
[i]是字符串i应该结束的位置。如果结尾的array [17] == 133,则意味着字符串17应该在字符串133的结尾处结束。array [i] ==
i,所有i都开始。那么,交换字符串只是交换两个整数的问题。
然后,任何类似quicksort的就地算法都可以很好地工作。
运行时间肯定取决于琴弦的最终移动。假设每个动作,您在合理大小的写入中移动了大约100GB的数据。我可能认为驱动器/控制器/操作系统可以为您移动约100MB
/秒。那么,大约1000秒?20分钟?
但是它适合内存吗?您有100GB的字符串,每个字符串为256个字节。多少弦?100 * 2 ^ 30/2 ^8,或大约419M字符串。您需要419M个整数,每个整数为4个字节,约合1.7GB。Voila,适合您的2GB。
请检查上面的结果输出。如您所见,在之后,它显示。但是我需要显示而不是。我尝试了两种方法,但结果是一样的。 已经检查了以下问题, MySQL排序字符串号 从VARCHAR强制转换为int-MySQL
问题内容: 我有一个包含数字的字符串列表,但找不到找到对它们进行排序的好方法。 例如,我得到这样的东西: 用的方法。 我知道我可能需要以某种方式提取数字,然后对列表进行排序,但是我不知道如何以最简单的方式进行操作。 问题答案: 也许您正在寻找人工排序(也称为自然排序): 产量 PS。我已经更改了答案,以使用Toothy的自然排序实现(在此处发表评论),因为它比我的原始答案快得多。 如果您希望使用浮
问题内容: 我有一个希望基于字符串类型的字段进行排序的对象列表。我尝试使用 但发现在JavaScript 中似乎不适用于字符串。如何根据字符串类型的属性对对象列表进行排序? 问题答案: 使用每个示例: 我们强制a.attr为字符串以避免异常。自InternetExplorer6和Firefox1开始受支持。您可能还会看到以下使用的不符合语言环境的代码:
问题内容: 我在排序包含整数的字符串时遇到问题。如果使用下面的代码,我将进行排序:1some,2some,20some,21some,3some,一些 但是我希望将其排序为:1some,2some,3some,20some,21some,一些 我怎样才能做到这一点? 谢谢! 问题答案: 这是有关如何执行此操作的独立示例(未特别优化): 输出量 说明 该示例使用一个常数来推断数字是否位于的起始位置。
问题内容: 我目前是python的新手,并陷入了这个问题,似乎找不到正确的答案。 问题:给出一个单词列表,按长度顺序(最长到最短)返回相同单词的列表,第二个排序标准应按字母顺序。提示:您需要考虑两个功能。 这是我到目前为止所拥有的: 它按长度排序,但我不知道如何将第二个标准应用于这种排序,即按字母顺序降序排列。 问题答案: 您可以按照以下两个步骤进行操作: Python的排序是稳定的,这意味着当长
问题内容: 我想按字母顺序对JAVA中的字符串进行排序,如下所示:AaBbCcDdEeFfGg之后是大写字母和小写字母。例如,如果我把AbaC退还给我AabC,谢谢! 问题答案: 如果先将字符放入数组中,则可以使用进行此操作。(为了使用不区分大小写的自定义比较器,它必须是对象数组,而不是基元。)