最有效的方法是确定一个集合的集合是否两两不相交,即验证所有集合对的交集是否为空。这可以在多大程度上实现高效?
最有效的方法是确定一个集合的集合是否两两不相交,即验证所有集合对的交集是否为空。这可以在多大程度上实现高效?
如果且仅当集合中所有元素互不相同时,集合的大小之和等于它们的并集大小(此语句适用于有限集合):
def pairwise_disjoint(sets) -> bool:
union = set().union(*sets)
return len(union) == sum(map(len, sets))
这可能只是一个简单的一行代码,但是可读性至关重要。
预计线性时间复杂度为O(元素总数):
def all_disjoint(sets):
union = set()
for s in sets:
for x in s:
if x in union:
return False
union.add(x)
return True
all
进行重载,对吧?最好使用不同的变量名。 - tscizzledef all_disjoint(sets):
S = list(sets)
while S:
s = S.pop() # remove an element
# loop over the remaining ones
for t in S:
# test for intersection
if not s.isdisjoint(t):
return False
return True
交集测试的次数与具有相同数量顶点的完全连接图中的边数相同。如果发现任何一对不是不相交的,则会提前退出。