如何从大型大型文件中删除重复项?这是一个关于算法和数据结构的面试问题,而不是sort -u
和类似的东西。
我认为该文件不适合内存且数字范围足够大,因此我无法使用内存中的计数/存储桶排序。
唯一的选择是看是对文件进行排序(例如merge sort
)并再次传递已排序的文件以过滤掉重复的文件。
有意义吗?还有其他选择吗?
答案 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树或类似的。这些通常存储在磁盘上,并按键顺序保持键/值对。