检查集合的集合是否成对不相交

时间:2014-03-16 04:04:11

标签: algorithm sorting set

确定集合集合是否成对不相交的最有效方法是什么? - 即验证所有成对集合之间的交集是空的。这样做效率如何?

3 个答案:

答案 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

交叉点测试的数量与完全连接的图形中的边数相同,顶点的数量与集合的数量相同。如果发现任何一对不是不相交的话,它也会提前退出。