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生成有序向量/列表A
- 从集合B生成有序向量/列表B
- 对有序的A、B进行迭代,在较小的元素上执行新的步骤-如果相同,则添加到result并同时移动这两个元素
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;
}
}
您需要的是集合的交集。我在回答中假设您正在处理大型集合。如果处理大量的小集合,您的方法会简单得多——只需对集合进行排序,然后逐步迭代这两个集合。