【发布时间】:2013-12-08 03:18:47
【问题描述】:
我正在尝试检查以确保我编写的加密算法是一对一的。为此,我遍历程序并将所有输出(其中 2^32 个)写入一个文件,每行一个。运行大约 9 小时后,该文件的大小刚刚超过 50GB。
现在我需要遍历所有输出行以验证没有重复项。这是一些示例输出:
PAAA#0+//V8//
PAAA#o+//37//
PAAA#Q+//Z7//
ZAAA#d///#
ZAAA#J///#
ZAAA#/+//#
我知道的最简单的方法是将每一行与它后面的所有行进行比较,但那将是 theta(n!),考虑到 n 是 2,我真的认为我不能等那么久^32.
有没有办法在 O(n) 或 O(n log n) 时间内进行这种比较?我不反对将它重新输出到数据库,如果这样会更快 - 我只是想在这一点上节省磁盘空间。
我在 Win7 上用 c++ 编写了程序,但如果可以更快地完成,我不反对在其他操作系统上使用其他语言。
提前感谢各位的帮助!
【问题讨论】:
-
当前存在的行是否有任何顺序? (基于原始程序如何编写文件)
-
不,目前没有排序顺序。我的算法的输入已排序,但输出未排序。
-
为什么不重新读取所有内容并将所有以'a'开头的行推入名为
bucket.a的文件中,所有以'b'开头的行推入bucket.b,等等向前?然后,您只需要检查bucket文件中的重复项,这些文件可能大约是 1/256 大。 (实际上,您可以对每个存储桶再次执行此过程以获得更小的块。) -
是的,这就是我在阅读 nhgrif 的回答后的想法。这似乎是最合理的解决方案。
标签: performance sorting time-complexity large-files string-comparison