查找在汉明距离下接近的所有值对


11

我有几百万个32位值。对于每个值,我想查找汉明距离为5的所有其他值。在幼稚的方法中,这需要比较,这是我想避免的。O(N2)

我意识到,如果我只是将这些32位值视为整数,并对列表进行一次排序,那么只有最低有效位不同的值最终会非常接近。这使我可以使用较短的“窗口”或数字范围,在其中可以对确切的汉明距离执行实际的成对比较。但是,当2个值仅在高阶位中发生变化时,它们最终将在此“窗口”之外并出现在已排序列表的相对两端。例如

11010010101001110001111001010110

01010010101001110001111001010110

即使它们的汉明距离为1,也将相距甚远。由于两个值之间的汉明距离都在旋转时得以保留,因此我认为通过进行32次左旋转然后每次对列表进行排序,很可能两个值在至少其中之一的排序列表中将足够接近结束。

  1. 尽管这种方法给我带来了良好的效果,但我仍在努力正式确定这种方法的正确性。

  2. 假设我正在寻找汉明距离为或更小的匹配值,是否真的需要进行所有32位旋转?例如,如果k = 1并且我的窗口大小是1000,则我需要以最大24位旋转角度进行操作,因为即使杂散位出现在8个低阶位中的任何一个中,所得到的数字相差也不会超过1000。kk=1


从20秒钟的思考中得出的想法:用Grey-Code排序怎么样?将32位位图列表分成四个8位位图列表,然后使用您的技术呢?
卡尔·丹格德·阿斯姆森

1
220230

@minar:我有3-4百万个这样的32位位图。
karterk

A[i]4×109A[i].closei

认为除了可应用的超立方体以外,还有类似的“四叉树”概念。该算法定位并递归地定位超立方体中的向量,然后,当您要搜索“附近”的位向量时,您仅搜索“附近”的超立方体。怀疑它可能已被研究并在某处的论文中。...不确定正确的术语....
vzn

Answers:


9

如上所述,您的方法存在问题,因为如果2个位图具有均匀间隔的差异,那么在任何旋转中,某些高阶位都会存在差异。

51/5064NN222

45529N4960N


附加信息:

  1. 51632
    (165)(325)0.0217
  2. 对于原始列表中的每个元素,列表的构造都放在扩展列表中:元素本身,所有元素在一个位置上不同,所有元素在两个位置上不同(保留有关原始元素的信息)。每个元素的副本数为此列表中的任何冲突(在排序后检测到)都对应于距离最大为两个原始元素。请注意,每个对都可以被检测到几次,因此您需要删除重复项(但是初始算法已经是这种情况)。1+32+(322)=529.4
  3. 对于最后一遍,最好修剪元素的扩充列表,以仅将元素与原始元素保持精确距离。然后,对于每个原始元素,在距离处创建元素,并在扩展列表中搜索它们。再次,您需要删除重复项,因为每对将被检测到次。[如果格外小心,您可能会预期/避免大多数重复,但是我不确定是否值得付出努力。]2(323)=49603(53)=10

对于第一种方法,您是说我以某些预定顺序置换位图,而不是仅进行位旋转吗?您能解释一下如何获得1/50概率吗?另外,对于第二种方法,我是否需要先为列表构建索引,然后为每个元素构建索引-生成(32C1 + 32C2)组合,并对照该索引进行检查,以识别相距2的所有位图?如果您可以进一步解释,那就太好了。谢谢。
karterk

5

minar的回答非常好,并且可能是解决此特定问题的正确方法。但是,我将提到另一种可能的方法:

您可以使用对位置敏感的哈希函数(LSH)。设计局部敏感的哈希函数,以便如果在汉明距离上接近,则。如果您具有这样的哈希,则可以将所有值存储到哈希表中(使用哈希函数和开放式哈希),然后您将能够很快找到所有在汉明距离内接近的值对。建立LSH的技术多种多样。您可以查看有关该主题的参考文献以找到几个候选对象。Hx,yH(x)=H(y)HH

也就是说,对于您的特定问题(具有您提到的特定参数),我希望minar的两种算法在实践中将比任何基于LSH的方案都更好。我仅在其他读者遇到类似问题但在参数不同的地方使用LSH可能更有意义时才提及此问题。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.