【发布时间】:2016-10-14 13:44:34
【问题描述】:
我这里有一个非常特殊的案例。我有一个包含数百万个条目的文件,想知道是否存在至少一个重复项。这里的语言不是很重要,但 C 似乎是速度的合理选择。现在,我想知道对此采取什么样的方法?速度是这里的主要目标。自然,一旦发现一个重复,我们就想停止查找,这很清楚,但是当数据进来时,我不知道它是如何排序的。我只知道这是一个字符串文件,由换行符分隔。现在请记住,我只想知道是否存在重复项。现在,我发现了很多关于在数组中查找所有重复项的 SO 问题,但大多数都是简单而全面的方式,而不是最快的方式。
因此,我想知道:找出数组是否至少包含一个重复项的最快方法是什么?到目前为止,我能在 SO 上找到的最接近的是:Finding out the duplicate element in an array。选择的语言并不重要,但毕竟是编程,多线程是可能的(我只是不确定这是否可行)。
最后,字符串的格式为 XXXNNN(3 个字符和 3 个整数)。
请注意,这不是严格理论上的。 将在机器上进行测试(Intel i7 with 8GB RAM),所以我必须考虑进行字符串比较等的时间。这就是为什么我也想知道它是否可以faster 将字符串一分为二,首先比较整数部分,因为int比较会更快,然后是字符串部分?当然,这也需要我拆分字符串并将后半部分转换为 int,这可能会更慢...
【问题讨论】:
-
如果数据没有排序,你将不得不从头到尾搜索并比较每个项目,没有办法绕过它。根据您将要使用多少数据,可能值得也可能不值得先对其进行排序。
-
您无需排序即可查找重复项。您可以将每个字符串插入哈希表并检查冲突中的重复项。哈希查找和插入的预期复杂度为 O(1),因此您可以拥有一个以预期 O(N) 运行的重复检测算法。事实上,如果这种方法没有出现在其他问题中,我会感到非常惊讶。
-
您可以在一次传递中为每个字符串分配一个介于 0 和 255 之间的整数值(一种签名,如校验和 mod 256)并创建一个包含 256 个整数列表的数组并放置在这些条目的前面,行号具有相同的签名。这有助于对可能相同的行进行分组。
-
是的,抱歉,3 位数,以 10 为底。@chux 600 万,已知
-
嗯,如果 26 个不同的字符和 10 个不同的数字组成 26*26*26*10*18*10 组合,为什么不使用 17,576,000 位表(2,197,000 字节)?