给定已知数量 N 的项目集。每个集合都包含 D - 1 ( N> = D )唯一(在集合中)项目。但是 D - 1 之间共享的每个项目都设置了。因此,每套都有两个"相邻"集合:两个邻居只有一个元素不同。此外,每一组都有(如果 D 足够大)两个更远的相邻集合,它们恰好相差两个元素,等等。所有集合形成一个封闭的链。
E.g。有十个要素a x b n q p j t r c
。 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)
=>相应的项目链是:r c j x p a n q b t
。作为向后替换的结果生成的示例。但是如何在算法上进行邻域修复?
One way is obvious:简单地枚举所有可能的集合对,并比较每对集合中的集合是否完全不同于一个元素(也可能有小的优化,但它们并不重要)。
Another way to solve the problem是为所有可能的 D - 2 - 元组的有序元素组生成(对于输入的每个集合)哈希,然后找到成对的冲突。有一个名为Locality-Sensitive Hashing的知识域。
这两种方法在我看来都是完全相反的。散列更快,但暗示调整(桶大小,选择向量元素的散列组合方式等),并且其大多数操作具有摊销恒定时间。因此,涉及一些概率行动。我可以得出结论,对于某些 D 和 N ,可能会遇到性能下降。
我怀疑有一种确定性(在上面意义上)找到所有相邻(相邻)集合的方式。
答案 0 :(得分:1)
这是O(D*N)
解决方案。
如果两个集合恰好在1个元素中不同,则将它们定义为邻居。例如。 xap
和pan
。
定义N
个桶,每个桶都标有一个元素。
a
包含xap
,pan
和anq
。a
。在桶中找到形成链的3组。例如。 xap
,pan
,anq
。这是链中的前3组。pan
和anq
,这是q
。转到这个桶。q
中,相邻anq
集是nqb
。将此集添加到链中。转到上一步,直到您回到第一组链,例如xap
。一个轻微的优化是在将链置放入链中后从桶中删除它们。