[英]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.