我有几百万个32位值。对于每个值,我想查找汉明距离为5的所有其他值。在幼稚的方法中,这需要比较,这是我想避免的。
我意识到,如果我只是将这些32位值视为整数,并对列表进行一次排序,那么只有最低有效位不同的值最终会非常接近。这使我可以使用较短的“窗口”或数字范围,在其中可以对确切的汉明距离执行实际的成对比较。但是,当2个值仅在高阶位中发生变化时,它们最终将在此“窗口”之外并出现在已排序列表的相对两端。例如
11010010101001110001111001010110
01010010101001110001111001010110
即使它们的汉明距离为1,也将相距甚远。由于两个值之间的汉明距离都在旋转时得以保留,因此我认为通过进行32次左旋转然后每次对列表进行排序,很可能两个值在至少其中之一的排序列表中将足够接近结束。
尽管这种方法给我带来了良好的效果,但我仍在努力正式确定这种方法的正确性。
假设我正在寻找汉明距离为或更小的匹配值,是否真的需要进行所有32位旋转?例如,如果k = 1并且我的窗口大小是1000,则我需要以最大24位旋转角度进行操作,因为即使杂散位出现在8个低阶位中的任何一个中,所得到的数字相差也不会超过1000。