当集合不是不相交时,是否存在类似于union find的交集查找算法?

时间:2014-02-12 07:03:16

标签: algorithm sorting data-structures computer-science

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

2 个答案:

答案 0 :(得分:1)

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

优化: -

如您所希望的那样,您可以执行huffman coding中使用的优化: -

  
      
  1. 使用首先选择最小集合的集合的优先级队列
  2.   
  3. 选择两个最小的集合,首先评估交集并将其添加到队列中。
  4.   
  5. 这样做直到你得到空的交叉点集或者剩下一组(交集)。
  6.   

注意:如果使用c ++

,请使用std :: set

答案 1 :(得分:0)

如果 您需要备用内存:

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

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

其中retrieveal可以是整数的范围(如果您使用的是原始数组)或者您的集合的基数(如果您使用哈希表来枚举值的值)哪个是出现的。)

如果你的集合的边界已知且很小,你可以使用一个足够大的整数数组来实现它,以保持最大数量的集合(通常为256集的8位字符)。

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