【问题标题】:How to find an distinct URL only in set A not in set B如何仅在集合 A 中而不在集合 B 中查找不同的 URL
【发布时间】:2010-09-29 01:33:19
【问题描述】:

有两组 URL,都包含数百万个 URL。现在,如何从 A 获取不在 B 中的 URL。最好的方法是什么?
注意:您可以使用任何技术,使用任何工具,如数据库、mapreduce、hashcode 等。我们应该考虑内存效率,时间效率。您必须考虑每组(A 和 B)都有数百万个 URL。我们应该尝试使用更少的内存和更少的时间找到特定的 URL。

【问题讨论】:

  • 在什么意义上最好?内存效率?省时吗?
  • 您要查找一个网址还是全部?
  • 有几百万个网址?特别是,我们是否可以期望它们都适合记忆?这是您只需要做一次的事情,还是需要重复做一次?
  • 我们应该考虑内存效率,时间效率。您必须考虑每组(A 和 B)都有数百万个 URL。我们应该尝试使用更少的内存和更少的时间找到特定的 URL。

标签: algorithm find mapreduce hashcode match


【解决方案1】:

一个不错的算法可能是:

将所有集合 A 加载到哈希图中,O(a)

遍历集合B,对于每一项,如果存在的话,从集合A(从hashmap)中删除相同的值,O(b)

然后你的哈希图就有了结果。这将是 O(a+b),其中 a 是集合 A 的大小,b 是集合 B 的大小。(在实践中,这将乘以散列时间,理想情况下,对于一个好的散列,这大约对应于 O(1) .)

【讨论】:

    【解决方案2】:

    可能有点幼稚的东西可能是这样的过程

    1. 排序列表A
    2. 排序列表 B
    3. 将列表 A 和 B 一起导航,以便:

      一个。当元素匹配时增加指向 A 的指针和指向 B 的指针

      b.递增指向 B 的指针,直到该元素与 a 中的下一个元素匹配,或者直到 B 中的记录 b 出现在 a 中的下一个元素之后(此规则丢弃 B 中不在 A 中的元素)

      c。根据这些规则递增时发现匹配项,使得B 中的下一个元素bA 中的下一个元素a 不匹配。


    这实际上可能是一个应用Bloom filters 的有趣地方:为集合 B 构造一个 Bloom 过滤器,然后为集合 A 中的每个 URL 确定它是否在集合 B 中。错误概率越来越小,您应该能够找到A 中的所有 URL 不在 B 中。

    【讨论】:

      【解决方案3】:
      (sort -u A; cat B B) | sort | uniq -u 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-28
        • 1970-01-01
        • 1970-01-01
        • 2023-03-07
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        • 2016-05-01
        相关资源
        最近更新 更多