如何从文件中删除重复项?

时间:2012-07-20 14:03:13

标签: algorithm data-structures language-agnostic

如何从大型大型文件中删除重复项?这是一个关于算法和数据结构的面试问题,而不是sort -u和类似的东西。

我认为该文件不适合内存且数字范围足够大,因此我无法使用内存中的计数/存储桶排序。

唯一的选择是看是对文件进行排序(例如merge sort)并再次传递已排序的文件以过滤掉重复的文件。

有意义吗?还有其他选择吗?

3 个答案:

答案 0 :(得分:3)

如果在mergesort中使用“merge”(a.k.a。“union”)的重复删除变体,则甚至不需要对已排序数据进行单独传递。散列表应该是空的,以便表现良好,即甚至比文件本身更大 - 我们被告知文件本身是

查找多方合并(例如here)和外部排序。

答案 1 :(得分:2)

是的,解决方案很有意义。

另一种方法是构建基于文件系统的哈希表,并将其维护为一个集合。首先迭代所有元素并将它们插入到您的集合中,稍后 - 在第二次迭代中,打印集合中的所有元素。

依赖于实现和数据,在大O复杂度方面表现更好,哈希提供O(n)时间平均情况和O(n^2)最坏情况,而合并排序选项提供更稳定O(nlogn)解决方案。

答案 2 :(得分:1)

Mergesort或Timsort(这是一个改进的mergesort)是一个好主意。 EG:http://stromberg.dnsalias.org/~strombrg/sort-comparison/

您也可以从布隆过滤器中获得一些里程数。这是一种具有低内存要求的概率数据结构。您可以使用bloom过滤器调整错误概率。 EG:http://stromberg.dnsalias.org/~strombrg/drs-bloom-filter/您可以使用一个来输出绝对唯一的值,然后通过其他方法仔细检查可能不是唯一的值。如果您的输入数据集有很多重复项,这将特别有用。它不需要直接比较元素,它只是使用潜在的大量散列函数来散列元素。

您也可以使用磁盘上的BTree或2-3树或类似的。这些通常存储在磁盘上,并按键顺序保持键/值对。