Algorithm 寻找两个集合的最大公共子集的有效算法?

Algorithm 寻找两个集合的最大公共子集的有效算法?,algorithm,set,Algorithm,Set,每个集合包含一组校验和。例如: 设置A: { 4445968d0e100ad08323df8c895cea15 A67F8052594D6BA3F7502C0B91B868F 07736dde2f8484a4a3af463e05f039e3 5b1e374ff2ba949ab49870ca24d3163a } 集合B: { 6639e1da308fd7b04b7635a17450df7c 4445968d0e100ad08323df8c895cea15 A67F8052594D6BA3F7502

每个集合包含一组校验和。例如:
设置A:
{
4445968d0e100ad08323df8c895cea15
A67F8052594D6BA3F7502C0B91B868F
07736dde2f8484a4a3af463e05f039e3
5b1e374ff2ba949ab49870ca24d3163a
}

集合B:
{
6639e1da308fd7b04b7635a17450df7c
4445968d0e100ad08323df8c895cea15
A67F8052594D6BA3F7502C0B91B868F
}

A和B的最大公共子集为:
{
4445968d0e100ad08323df8c895cea15
A67F8052594D6BA3F7502C0B91B868F
}

很多这样的操作都会被执行,所以我正在寻找一个高效的算法来完成。
感谢您的帮助。

将它们粘贴到哈希表中,并注意精确的冲突。

将其中一个集合放入哈希表中,然后迭代另一个集合,丢弃哈希表中不存在的元素。或者,对两者进行排序并同时迭代,如在合并排序中

编辑:后一种方法创建排序结果。我应该补充一点,如果集合的大小大不相同,并且它们是预分类的(比如说,因为您正在进行一系列的交叉),那么您可以通过使用“无界”二进制搜索在大列表中提前跳过来实现大的性能改进

  • 将集合A添加到可以查找是否存在校验和的结构中
  • 循环集合B,检查集合A中是否存在元素,如果存在,则添加到集合C
  • 集合C是您的公共子集。

    • 从集合A生成有序向量/列表A
    • 从集合B生成有序向量/列表B
    • 对有序的A、B进行迭代,在较小的元素上执行新的步骤-如果相同,则添加到result并同时移动这两个元素
    当底层集合结构是有序的(常见的情况是一种树(BST、AVL等)),那么您只需要执行最后一步

    为了明确最后一步,这里是它的伪代码:

    a = A.begin(); b = B.begin();
    while(a!=A.end() && b!=B.end()){
      if(*a==*b){
        results.add(a);
        ++a; ++b;
      } else if(*a < *b) {
        ++a;
      } else {
        ++b;
      }
    }
    
    a=a.begin();b=b.begin();
    而(a!=a.end()&&b!=b.end()){
    如果(*a==*b){
    结果.增加(a);
    ++a、 ++b;
    }否则,如果(*a<*b){
    ++a;
    }否则{
    ++b;
    }
    }
    
    您需要的是集合的交集。我在回答中假设您正在处理大型集合。如果处理大量的小集合,您的方法会简单得多——只需对集合进行排序,然后逐步迭代这两个集合。