两个整数的汉明距离 mysql

Hamming distance of two integers mysql

mysql 架构和查询在这里

http://sqlfiddle.com/#!9/444873/1

查询似乎有效,returns 对我来说只有行 汉明距离小于 7 位。

似乎以下 属性 适用:

bit_count(a ^ b ) >= abs(bit_count(a) - bit_count(b))

一些例子

                bit_count
a     1111       4
b     0000       0
a^b   1111       4

a     1010       2
b     0110       2
a^b   1100       2

a     1001       2    
b     1001       2
a^b   0000       0

上面的不等式是真的吗?

如果是,有人可以提供证明吗?

我这么问是因为如果上面的不等式成立那么 我使用的索引对减少查询时间很有意义

这里有一个证明,它可能做得更简单,但还不错。

通过归纳位串的长度,基本情况是空串,显然不等式成立。

归纳步骤是在 A 和 B 之前添加(或附加,没有任何区别)。

  • 如果我们在两者前面加上 0,则 popcnts 不会改变,因此不等式仍然成立。
  • 如果我们在其中一个前面加上 0 而在另一个前面加上 1,则它们的 XOR 将再设置一位,因此 LHS 上升 1。在 RHS 中,其中一个 popcnts 上升(不不管哪个,绝对差是可交换的),因此 RHS 将 up 增加 1(与 LHS 相同,没问题)或 down 乘以 1(仍然可以,允许 RHS 小于 LHS,但这就是不相等的原因)
  • 如果我们在两者前面加一个 1,它们的 XOR 不会改变,所以 LHS 保持不变。在 RHS 中,两个 popcnts 都增加 1,它们相互抵消,因此 RHS 也保持不变。

因此这个不等式适用于任何长度的位串。