【问题标题】:How to sort a big file of sentences with variable length?如何对具有可变长度的句子的大文件进行排序?
【发布时间】:2016-04-29 14:28:08
【问题描述】:

假设我有一个多行字符串的文件,如何按字典顺序排列字符串的行数?

详情:

  • 文件大小约为32GBytes;
  • 每一行可视为一个句子,其中包含可变数量的单词,以空格分隔,即每行的长度不固定;
  • 每个单词只包含 ASCII 字符;
  • 我只有 8 GBytes 内存,但磁盘空间不受限制;

我能弄清楚的是一个外部合并排序,对于这个指定的问题有什么更好的主意吗?

【问题讨论】:

  • 外部合并排序听起来是个不错的选择。您也可以考虑根据(比如说)第一个字符来拆分文件——首先制作一个小直方图来弄清楚如何拆分它——然后对每个生成的子文件进行排序并将它们连接起来。 (您可以实际编写子文件,也可以通过单独的 32GB 大文件动态生成每个子文件。)
  • 很难比sort < infile > outfile做得更好。 GNU sort(可能还有 Windows 版本)自动处理比内存大得多的文件,必要时使用高效的多通道合并。

标签: algorithm sorting ranking


【解决方案1】:

文件大小和内存之间的差异并不大,因此我建议根据第一个字母将文件拆分为更小的文件 - 如果不够,则按前两个字母。

然后您可以使用快速排序对它们中的每一个进行排序并保存,当它们被排序后,您可以将它们重新组合在一起。

仍然是 O(N) 次 I/O 操作和 O(n*log(N)) 次 CPU 操作。

PS : 外部归并排序也是不错的方法。

【讨论】:

  • 感谢您的回答。您能否详细描述拆分的工作原理?由于我们有可变长度的行,我认为按字母散列可能会导致溢出。例如,如果我们有 10% 的行数以字母 'aa' 开头,它们总共占据 50% 的空间(假设它们是很长的 'aa blabla bla bla...' 句子)。
  • @idailylife - 这可能会发生,但不太可能发生。如果您要进行一次性导入,您可以尝试一下,如果它不占用内存,您就可以了。如果它下降,你可以改变行为。如果您想要通用解决方案,您可以始终将太大的文件拆分为越来越多的前缀字母(在加载之前您会看到每个文件的大小)。
猜你喜欢
  • 2019-04-20
  • 1970-01-01
  • 2017-02-02
  • 1970-01-01
  • 2014-11-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多