簡體   English   中英

在集合列表中查找不相交集合的對數

[英]Find number of pairs of disjoint sets in a list of sets

問題陳述如下:給定n個集合的列表,每個集合包含k個整數,找到不相交集合的對數。 假設集合中可能的元素為正,且在上方被c> n限制,並假設k << n。

我試圖提出一種比O(kn ^ 2)更快的有效算法來解決此問題,這是天真的解決方案的運行時間。

我能想到的最佳策略包括遍歷列表中的每個集合,並對集合的元素進行哈希處理,以使集合中的每個元素都映射到包含它的集合的一組索引。 然后,對於迭代中的當前集合,將其c個元素用作鍵,並考慮由哈希表作為值給出的c個索引集的並集。 這個結果索引集表示到目前為止遇到的與當前集不脫節的集數,我們可以使用它來查找不相交集的數。 在整個迭代過程中求和該值可得出正確答案。 但是,由於聯合運算為O(n),因此此策略沒有比單純的解決方案更好的方法。

解決此問題的最有效解決方案是什么?

由於k << n,您可以通過以下方法降低復雜度:

  • 對每個集合進行排序,可以是n * k * log(k)
  • 然后按第一個倒數第二個元素n * log(n)對所有集合進行排序

現在比較需要n *(n-1)個操作,它們是:

  • 將s1.Last與s2.First進行比較(應該是大多數情況,如k << n)
  • 或者考慮到s1和s2已排序,可以有效地搜索k最大的s1 s2交點

暫無
暫無

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

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