【问题标题】:given 10 billion URL with average length 100 characters per each url, check duplicate给定 100 亿个 URL,每个 URL 平均长度为 100 个字符,检查重复
【发布时间】:2018-01-05 16:25:49
【问题描述】:

假设我有 1GB 内存可用,如何在这些 url 中找到重复的?

我在《Cracking the Coding Interview》一书中看到了一个解决方案,它建议使用hashtable将这些url分成4000个文件x.txt,x = hash(u)%4000在初次扫描。在第二次扫描中,我们可以分别检查每个 x.txt 文件中的重复项。

但是我如何保证每个文件可以存储大约 1GB 的 url 数据呢?我认为有些文件可能会比其他文件存储更多的 url 数据。

我对这个问题的解决方案是迭代地实现文件分离技巧,直到文件足够小以供我使用。

还有其他方法吗?

【问题讨论】:

    标签: algorithm memory scalability


    【解决方案1】:

    如果您不介意需要更多代码的解决方案,您可以执行以下操作:

    1. 仅计算哈希码。每个哈希码正好是 4 个字节,因此您可以完美控制每个哈希码块将占用的内存量。您还可以在内存中容纳比 URL 更多的哈希码,因此您将拥有更少的块。

    2. 查找重复的哈希码。据推测,它们将远少于 100 亿。它们甚至可能都适合记忆。

    3. 再次检查 URL,重新计算哈希码,查看 URL 是否具有重复的哈希码之一,然后比较实际 URL 以排除由于哈希码冲突导致的误报。 (有 100 亿个 url,而哈希码只有 40 亿个不同的值,会有很多冲突。)

    【讨论】:

      【解决方案2】:

      评论有点长。

      事实是,您不能保证文件会小于 1 GB。我不确定这 4,000 是从哪里来的。总数据量约为 1,000 GB,因此平均文件大小为 250 MB。

      您极不可能将尺寸缩小 4 倍。当然,这是可能的。在这种情况下,只需将文件再次拆分为几个其他文件。这增加的复杂性可以忽略不计。

      这没有考虑到一个简单的案例。如果其中一个 URL 的长度为 100 并且在数据中出现 10,000,000 次怎么办?哎哟!在这种情况下,您需要读取一个文件并通过将每个值与一个计数相结合来“减少”它。

      【讨论】:

      • 感谢这个极端案例,我还没有考虑过!当您提到通过将每个值与计数组合来“减少”文件时,您是指将每个重复的 url 与计数组合以使它们与众不同吗?
      • @TonyL 。 . .是的。在 SQL 世界中,我会说“按 URL 聚合”。您可以为此使用哈希匹配算法,从而减少数据量。
      猜你喜欢
      • 2011-02-02
      • 1970-01-01
      • 2016-01-18
      • 2013-07-28
      • 1970-01-01
      • 2020-08-14
      • 2020-11-14
      • 1970-01-01
      • 2015-05-19
      相关资源
      最近更新 更多