![](/img/trans.png)
[英]python algorithm: how to efficiently find if two integer sets are intersected?
[英]Adjacency of intersected sets
給定已知數量的N套項目。 每個集合正好包含D-1 ( N> = D )個唯一的(集合內)項目。 但是每個項目在D-1套之間共享。 因此,每個集合都有兩個“鄰居”集合:兩個鄰居之間的差異只有一個元素。 同樣,每個集合都有(如果D足夠大)兩個距離較遠的相鄰集合,它們之間的差值恰好是兩個元素,依此類推。所有集合一起形成一條閉合鏈。
例如,有十個元素axbnqpjtrc
。 D = 4 。 和集為(括號中為相鄰集可能排序的提示):
c x j (1)
p j x (2)
x a p (3)
p a n (4)
n q b (6)
a n q (5)
b r t (8)
b q t (7)
j c r (0)
c t r (9)
=>各自的項目鏈是: rcjxpanqbt
。 該示例是向后替換的結果。 但是如何通過算法進行鄰域恢復呢?
一種明顯的方法是 :簡單地枚舉所有可能的集合對,並比較每對集合中的集合,無論它們之間是否有一個元素完全不同(也可以進行小的優化,但並不重要)。
解決該問題的另一種方法是為元素的有序集合的所有可能的D-2-元組生成(對於輸入的每個集合)哈希,然后找到沖突對。 有一個知識域,稱為“ 局部敏感哈希” 。
在我看來,這兩種方法完全相反。 散列速度更快,但意味着要進行調整(存儲桶大小,選擇矢量元素的散列組合方式等),並且其大多數操作會攤銷固定時間。 因此,其中涉及一些概率動作。 我可以得出結論,對於某些D和N ,性能可能會下降。
我懷疑有一種確定性的(在某種意義上)找到所有相鄰(相鄰)集合的方法。
這是O(D*N)
解決方案。
如果兩個集合的正好不同,則將兩個集合定義為鄰居。 例如xap
和pan
。
定義N
存儲桶,每個存儲桶都用單個元素標記。
a
anq
xap
, pan
和anq
。 a
。 在存儲桶中找到3組,形成一條鏈。 例如xap
, pan
和anq
。 這是該鏈中的前3組。 pan
和anq
,這是q
。 轉到此存儲桶。 q
,集合的相鄰anq
為nqb
。 將此集合添加到鏈中。 轉到上一步,直到您返回到鏈的第一組,例如xap
。 一種稍微優化的方法是將集放入鏈中后,將其從存儲桶中刪除。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.