Algorithm 识别不相交(超)集
我正在寻找一种算法来识别一组集合中的不相交(超)集合 假设我有一组集合,包含集合a,B,C和D,即{a,B,C,D}。每个集合可能与其他集合的部分或全部相交,也可能不相交 我想确定非相交(超)集 示例: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)}的输出
- 如果只有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,边是交点,我理解对了吗?顺便说一句,如果你回答这个问题,哪怕是一个简短的问题,我也会接受。非常感谢你提供代码来支持你的建议!