从一组集合中找到所有不相交集合的算法是什么?
What can be the algorithm to find all disjoint sets from a set of sets?
我有 'n' 组 (n<10)。每组可能有 1000 个元素。我想找到这些集合的所有不相交集合。例如,我有集合
A = {2,5,6,7}, B = {5,1} and C = {5,7}.
那么输出将是{{5}, {2,6}, {1}, {7}}
。这可以是什么算法?我考虑过找到成对的不相交集,然后使用这些新的(不相交的)集再次从剩下的集合中找到不相交的集。但这不会很好地扩展。希望这会有所帮助:Diagram Example
您可以将您的问题视为布尔值两项映射,元素是行,集合是列,布尔值是问题的答案是集合中包含的元素。例如你的例子是:
t A B C
2 1 0 0
5 1 1 1
6 1 0 0
7 1 0 1
1 0 1 0
然后为描述它所在的不同集合的每个元素创建一个键,并在映射中注册该元素。
例如,如果我们认为密钥创建函数是这样的:
int keyFunction(bool Xa, bool Xb, bool Xc) {
int key =0;
if (Xa) {key+=4;}
if (Xb) {key+=2;}
if (Xc) {key+=1;}
return key;
}
然后我们可以创建地图:
Key ElementsQueue
0 []
1 []
2 [1]
3 []
4 [2,6]
5 [7]
6 []
7 [5]
和return这张地图的元素。
我有 'n' 组 (n<10)。每组可能有 1000 个元素。我想找到这些集合的所有不相交集合。例如,我有集合
A = {2,5,6,7}, B = {5,1} and C = {5,7}.
那么输出将是{{5}, {2,6}, {1}, {7}}
。这可以是什么算法?我考虑过找到成对的不相交集,然后使用这些新的(不相交的)集再次从剩下的集合中找到不相交的集。但这不会很好地扩展。希望这会有所帮助:Diagram Example
您可以将您的问题视为布尔值两项映射,元素是行,集合是列,布尔值是问题的答案是集合中包含的元素。例如你的例子是:
t A B C
2 1 0 0
5 1 1 1
6 1 0 0
7 1 0 1
1 0 1 0
然后为描述它所在的不同集合的每个元素创建一个键,并在映射中注册该元素。
例如,如果我们认为密钥创建函数是这样的:
int keyFunction(bool Xa, bool Xb, bool Xc) {
int key =0;
if (Xa) {key+=4;}
if (Xb) {key+=2;}
if (Xc) {key+=1;}
return key;
}
然后我们可以创建地图:
Key ElementsQueue
0 []
1 []
2 [1]
3 []
4 [2,6]
5 [7]
6 []
7 [5]
和return这张地图的元素。