确定集合集合是否成对不相交的最有效方法是什么? - 即验证所有成对集合之间的交集是空的。这样做效率如何?
答案 0 :(得分:5)
预期线性时间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
假设您的输入是表示为某种无序数据结构(哈希表?)的集合的集合,这是最优的,因为您需要至少查看一次每个元素。
您可以通过为集合使用不同的表示来做得更好。例如,通过维护一个全局哈希表,为每个元素存储它所存储的集合的数量,您可以最佳地执行所有设置操作,并检查O(1)中的不相交。
答案 1 :(得分:4)
集合中的集合是成对不相交的,当且仅当它们的并集大小等于它们的大小之和时(此语句适用于有限集合):
def pairwise_disjoint(sets):
union = set().union(*sets)
n = sum(len(u) for u in sets)
return n == len(union)
这可能只是一行,但readability counts。
答案 2 :(得分:1)
使用Python作为psudo代码。以下测试每对集合的交集仅一次。
def 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
交叉点测试的数量与完全连接的图形中的边数相同,顶点的数量与集合的数量相同。如果发现任何一对不是不相交的话,它也会提前退出。