簡體   English   中英

檢查集合的集合是否成對不相交

[英]Check if a collection of sets is pairwise disjoint

確定集合集合是否成對不相交的最有效方法是什么? - 即驗證所有對集合之間的交集是否為空。 這樣做有多高效?

預期線性時間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)中的不相交性。

如果且僅當其並集的大小等於其大小的總和(此語句適用於有限集)時,集合中的集合是成對不相交的:

def pairwise_disjoint(sets):
    union = set().union(*sets)
    n = sum(len(u) for u in sets)
    return n == len(union)

這可能是一個單行,但可讀性很重要

使用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

交叉點測試的數量與完全連接的圖形中的邊數相同,頂點的數量與集合的數量相同。 如果發現任何一對不被分離,它也會提前退出。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM