我基本上是在重复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。



