簡體   English   中英

相交集的鄰接

[英]Adjacency of intersected sets

給定已知數量的N套項目。 每個集合正好包含D-1N> = 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-元組生成(對於輸入的每個集合)哈希,然后找到沖突對。 有一個知識域,稱為“ 局部敏感哈希”

在我看來,這兩種方法完全相反。 散列速度更快,但意味着要進行調整(存儲桶大小,選擇矢量元素的散列組合方式等),並且其大多數操作會攤銷固定時間。 因此,其中涉及一些概率動作。 我可以得出結論,對於某些DN ,性能可能會下降。

我懷疑有一種確定性的(在某種意義上)找到所有相鄰(相鄰)集合的方法。

這是O(D*N)解決方案。

如果兩個集合的正好不同,則將兩個集合定義為鄰居。 例如xappan

定義N存儲桶,每個存儲桶都用單個元素標記。

  1. 將每個集合的副本放入每個關聯的存儲桶中。 例如,水桶a anq xappananq
  2. 通過選擇任何桶開始鏈條,說a 在存儲桶中找到3組,形成一條鏈。 例如xappananq 這是該鏈中的前3組。
  3. 根據當前鏈中的最后兩個集合,找到最后一個集合中不在前一個集合中的元素。 對於pananq ,這是q 轉到此存儲桶。
  4. 在當前存儲桶中,找到與鏈中最后一個元素相鄰的集合。 例如,在存儲桶q ,集合的相鄰anqnqb 將此集合添加到鏈中。 轉到上一步,直到您返回到鏈的第一組,例如xap

一種稍微優化的方法是將集放入鏈中后,將其從存儲桶中刪除。

暫無
暫無

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

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