假设我们有lexicographicaly整数3,5,6,9,10,12 or 0011,0101,0110,1001,1010,1100
每个都设置了两个位。
我想要的是使用尽可能少的操作来找出说3
和5
之间的距离(它们之间有多少字典排列,而不进行实际排列)。
距离表如下
3->5 = 1 or 0011->0101 = 0001
3->6 = 2 or 0011->0110 = 0010
3->9 = 3 or 0011->1001 = 0011
3->10 = 4 or 0011->1010 = 0100
3->12 = 5 or 0011->1100 = 0101
因此函数f(3,5)将返回1;
该函数将始终采用相同汉明权重(相同的设定位数)的参数。
不应使用任何数组。
任何想法都会很棒。
修改
忘记提及,对于任何设定的比特大小(汉明重量),我将始终使用第一个词典排列(base
)作为第一个参数。
E.g。
hamming weight 1 base = 1
hamming weight 2 base = 3
hamming weight 3 base = 7
...
编辑2
解决方案适用于任何海明重量,抱歉我不够具体。
答案 0 :(得分:5)
有一个号码
x = 2 k 1 +2 k 2 + ... + 2 k 米子>
其中k 1 < k 2 < ...< k m
可以声称,具有相同汉明重量的所有数字的按字典顺序排列的数字x的位置是
lex_order(x)= C(k 1 ,1)+ C(k 2 ,2)+ ... + C(k m ,M)
其中C(n,m)= n!/ m!/(n-m)!或者如果m> n
示例:
3 = 2 0 + 2 1
lex_order(3)= C(0,1)+ C(1,2)= 0 + 0 = 0
5 = 2 0 + 2 2
lex_order(5)= C(0,1)+ C(2,2)= 0 + 1 = 1
6 = 2 1 + 2 2
lex_order(6)= C(1,1)+ C(2,2)= 1 + 1 = 2
9 = 2 0 + 2 3
lex_order(9)= C(0,1)+ C(3,2)= 0 + 3 = 3
答案 1 :(得分:3)
如果a
和b
是两个设置位的位置,零是最不重要的位置,a
总是大于b
,那么你可以计算:
n = a*(a-1)/2 + b
两个值之间的距离是两个n
值之间的差异。
示例:
3->12:
3: a1=1, b1=0, n1=0
12: a2=3, b2=2, n2=5
answer: n2-n1 = 5
要将此扩展到其他汉明重量,您可以使用以下公式:
n = sum{i=1..m}(factorial(position[i])/(factorial(i)*factorial(position[i]-i)))
其中m
是汉明权重,而位置[i]是i
'设置位的位置,从最低有效位开始计数,最低有效位设置位为{ {1}}。