【问题标题】:Is there any intersection find algorithm similar to union find when sets are not disjoint?当集合不不相交时,是否有任何类似于联合查找的交集查找算法?
【发布时间】:2014-03-10 08:43:18
【问题描述】:

我想找到包含整数值的集合的交集? 如果假设您有 4-5 个具有 2k-4k 整数的列表,那么最有效的方法是什么?

【问题讨论】:

标签: algorithm sorting data-structures computer-science


【解决方案1】:

如果你有多余的内存:

  • 创建一个包含每个值出现次数的集合。
  • 对于每个集合中的每个整数 I,增加 I 的出现次数
  • 提取出现次数等于集合数的整数

这在理论上是 O(所有集合基数的总和 + 检索)

其中retrieveal 可以是整数的范围(如果您使用的是原始数组)或集合并集的基数(如果您使用哈希表来枚举发生被定义)。

如果您的集合的边界已知且很小,您可以使用一个简单的整数数组来实现它,该数组大到足以容纳最大集合数(通常为 256 个集合的 8 位字符)。

否则,您将需要某种哈希表,理论上它仍应在 o(n) 中。

【讨论】:

    【解决方案2】:

    在许多语言中,例如 c++ 集合被实现为平衡二叉树,因此您可以直接评估 O(NlogM) 中的集合交集,使用 n 作为较小的集合大小,只需查看 O(logM) 中的另一个集合即可。

    优化:-

    您可以根据需要对多个集合进行优化,在huffman coding 中使用:-

    1. 使用集合的优先级队列,首先选择最小集合
    2. 选择两个最小的集合,首先评估交集并将其添加到队列中。
    3. 执行此操作,直到获得空的交集或剩下一组(交集)。

    注意:如果使用c++,则使用std::set

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-05-28
      • 2011-01-20
      • 1970-01-01
      • 2019-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多