有没有办法有效地(按位操作)找到两个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
^^^^^^^
我可以使用像对数这样的东西,但效率不高
答案 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
操作(逻辑求和),然后找到最大量的零,逐个进行。希望我能回答你的问题。