Algorithm 识别不相交(超)集

Algorithm 识别不相交(超)集,algorithm,set,Algorithm,Set,我正在寻找一种算法来识别一组集合中的不相交(超)集合 假设我有一组集合,包含集合a,B,C和D,即{a,B,C,D}。每个集合可能与其他集合的部分或全部相交,也可能不相交 我想确定非相交(超)集 示例: 如果A&B相交,C&D相交,但是(A并集B)不相交(C并集D),我想要{(A并集B),(C并集D)}的输出 如果只有C&D相交,我希望输出{A,B,(C联合D)} 我相信这个问题早就解决了。谁能给我指一下正确的方向吗 当然,如果有人已经完成了这项工作,并且有一个python实现,并且愿意与大

我正在寻找一种算法来识别一组集合中的不相交(超)集合

假设我有一组集合,包含集合a,B,C和D,即{a,B,C,D}。每个集合可能与其他集合的部分或全部相交,也可能不相交

我想确定非相交(超)集

示例:

  • 如果A&B相交,C&D相交,但是(A并集B)不相交(C并集D),我想要{(A并集B),(C并集D)}的输出
  • 如果只有C&D相交,我希望输出{A,B,(C联合D)}
我相信这个问题早就解决了。谁能给我指一下正确的方向吗


当然,如果有人已经完成了这项工作,并且有一个python实现,并且愿意与大家分享,那就更好了。:-)

我将通过构造一个节点是边连接集与交集的图的图,将这从集问题转化为图问题

下面是一些代码。它需要一个字典将集合的名称映射到集合。它返回连接的集合名称集合的数组

def set_supersets (sets_by_label):
    element_mappings = {}
    for label, this_set in sets_by_label.items():
        for elt in this_set:
            if elt not in element_mappings:
                element_mappings[elt] = set()
            element_mappings[elt].add(label)
    graph_conn = {}
    for elt, sets in element_mappings.items():
        for s in sets:
            if s not in graph_conn:
                graph_conn[s] = set()
            for t in sets:
                if t != s:
                    graph_conn[s].add(t)

    seen = set()
    answer = []
    for s, sets in graph_conn.items():
        if s not in seen:
            todo = [s]
            this_group = set()
            while 0 < len(todo):
                t = todo.pop()
                if t not in seen:
                    this_group.add(t)
                    seen.add(t)
                    for u in graph_conn[t]:
                        todo.append(u)
            answer.append(this_group)
    return answer

print(set_supersets({
    "A": set([1, 2]),
    "B": set([1, 3]),
    "C": set([4, 5]),
    "D": set([3, 6])
}))
def set_超集(按标签设置):
元素_映射={}
对于标签,此项按标签设置。项()
对于本组中的elt:
如果elt不在元素映射中:
元素映射[elt]=set()
元素映射[elt]。添加(标签)
图_conn={}
对于elt,在元素_映射中设置。items()
对于集合中的s:
如果s不在图形连接中:
图_conn[s]=set()
对于t系列:
如果t!=s:
图形连接[s]。添加(t)
seen=set()
答案=[]
对于s,在图_conn.items()中设置:
如果未在中看到:
todo=[s]
此组=集合()
当0
如果A与B相交,C与C相交,D与A相交,但A、C与B、D不相交,您需要什么输出?如果你想要(A并集B并集C并集D),那么我会把它转化为寻找一个图的连通分量。我想要(A并集B并集C并集D)。感谢您对图表的参考。既然你似乎有一些经验,你会如何构建图表?节点是A,B,C,D,边是交点,我理解对了吗?顺便说一句,如果你回答这个问题,哪怕是一个简短的问题,我也会接受。非常感谢你提供代码来支持你的建议!