如何从大数字的大文件中删除重复项?这是一个关于算法和数据结构的面试问题,而不是sort -u
诸如此类的问题。
我假设该文件不适合内存并且数字范围足够大,因此我不能使用内存计数/桶排序。
唯一的选择是对文件进行排序(例如merge sort
)并再次传递排序后的文件以过滤掉重复项。
是否有意义。还有其他选择吗?
如何从大数字的大文件中删除重复项?这是一个关于算法和数据结构的面试问题,而不是sort -u
诸如此类的问题。
我假设该文件不适合内存并且数字范围足够大,因此我不能使用内存计数/桶排序。
唯一的选择是对文件进行排序(例如merge sort
)并再次传递排序后的文件以过滤掉重复项。
是否有意义。还有其他选择吗?
如果您在合并排序中使用“合并”(又名“联合”)的重复删除变体,您甚至不需要单独传递已排序的数据。哈希表应该是空的以表现良好,即比文件本身还要大 - 我们被告知文件本身很大。
查找多路合并(例如此处)和外部排序。
是的,解决方案是有道理的。
另一种方法是构建基于文件系统的哈希表,并将其作为一个集合进行维护。首先迭代所有元素并将它们插入到您的集合中,然后 - 在第二次迭代中,打印集合中的所有元素。
就大 O 复杂性而言,执行和数据相关的性能更好,哈希提供O(n)
时间平均情况和O(n^2)
最坏情况,而合并排序选项提供更稳定的O(nlogn)
解决方案。
Mergesort 或 Timsort(这是一种改进的合并排序)是一个好主意。例如:http : //stromberg.dnsalias.org/~strombrg/sort-comparison/
您可能还可以从布隆过滤器中获得一些里程。它是一种概率数据结构,对内存的要求很低。您可以使用布隆过滤器调整错误概率。EG:http ://stromberg.dnsalias.org/~strombrg/drs-bloom-filter/ 您可以使用一个来丢弃绝对唯一的值,然后通过其他方法更仔细地检查可能不是唯一的值. 如果您的输入数据集有很多重复项,这将特别有价值。它不需要直接比较元素,它只是使用可能大量的散列函数对元素进行散列。
您还可以使用磁盘 BTree 或 2-3 树或类似的。这些通常存储在磁盘上,并按键顺序保持键/值对。