两个二进制字符串之间的距离

时间:2015-02-08 01:00:23

标签: bit-manipulation

有没有办法有效地(按位操作)找到两个8位二进制字符串的距离(汉明距离!)?

保证每个字节只设置一个位。

像:

a=0 0 0 0 0 0 0 1
b=0 0 0 1 0 0 0 0

  0 0 0 1 0 0 0 1 -> distance = 3
          ^^^^^ 
------
a=0 0 0 0 0 1 0 0
b=0 1 0 0 0 0 0 0

  0 1 0 0 0 1 0 0 -> distance = 3
      ^^^^^
------
a=0 1 0 0 0 0 0 0
b=0 0 0 0 0 0 1 0

  0 1 0 0 0 0 1 0 -> distance = 4
      ^^^^^^^

我可以使用像对数这样的东西,但效率不高

2 个答案:

答案 0 :(得分:1)

"高效"这里可能意味着不同的东西:例如,已知输入范围的渐近与性能;时间与空间;等

我假设你关心你所描述的小有界输入的原始速度。

基线接近。取较小的位,然后左移直到它等于较大的位,计算移位。虽然这是O(n),但这种分析在这里并不重要,因为n是有界的。

您可以将该基线与以下任一方法进行比较,这些方法具有更好的时间复杂度,但输入速度可能更快,也可能不会更快。

备选方案1。将所有距离放在查找矩阵中。 O(1)时间复杂度,但O(n ^ 2)空间复杂度。

备选方案2. 拥有对数的查找表,并返回差异日志 2 (a) - log 2 (b) ,其中a>> = b。 O(1)时间复杂度,O(n)空间复杂度。 (请注意,我假设dist(a,a)= 0,这与您在上面描述的内容相同。)

我在实践中并不知道哪些会更快,但主要的一点是不要假设O(n)意味着算法的输入绝对值较慢。

答案 1 :(得分:0)

您可以使用OR操作(逻辑求和),然后找到最大量的零,逐个进行。希望我能回答你的问题。