【问题标题】:How to remove duplicates from a file?如何从文件中删除重复项?
【发布时间】:2012-07-20 14:03:12
【问题描述】:

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

我假设该文件不适合内存并且数字范围足够大,因此我无法使用内存计数/桶排序。

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

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

【问题讨论】:

  • 您对输入的了解越多,选择/开发适当算法的位置就越好。

标签: algorithm data-structures language-agnostic


【解决方案1】:

如果您在合并排序中使用“合并”(也称为“联合”)的重复删除变体,您甚至不需要单独传递已排序的数据。哈希表应该是空的才能正常运行,即比文件本身还要大 - 我们被告知文件本身是

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

【讨论】:

    【解决方案2】:

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

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

    在大 O 复杂度方面表现更好取决于实现和数据.

    【讨论】:

      【解决方案3】:

      Mergesort 或 Timsort(这是一种改进的合并排序)是一个好主意。例如:http://stromberg.dnsalias.org/~strombrg/sort-comparison/

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-03-27
        • 1970-01-01
        • 1970-01-01
        • 2013-12-13
        • 1970-01-01
        相关资源
        最近更新 更多