也许你会发现这张纸 http://btw2017.informatik.uni-stuttgart.de/slidesandpapers/F8-11-13/paper_web.pdf有用(我写的)。它包含有效创建位串排列的算法。
例如,inc()
算法:
long inc(long h_in , long m0 , long m1) {
long h_out = h_in | (~m1); //pre -mask
h_out ++;
// increment
h_out = (h_out & m1) | m0; //post -mask
return h_out;
}
它需要一个输入h_in
并返回下一个更高的值,该值至少比h_in
并“匹配”边界m0
and m1
。 “匹配”意味着:结果有一个1
无论在哪里m0
has a 1
,结果有一个0
无论在哪里m1
has a 0
。不是那个h_in
必须是关于以下方面的有效值mo
and m1
!另外,请注意m0
必须按位小于m1
, 意思就是m0
不能有一个1
处于一个位置m1
has a 0
.
这可用于生成与给定输入字符串具有最小编辑距离的排列:
假设你有0110
,你首先将其否定1001
(编辑距离=k)。
设置“m0=1001”和“m1=1001”。使用它只会导致“1001”本身。
现在获取具有编辑距离的所有值k-1,您可以执行以下操作,只需翻转其中一位m0
or m1
, then inc()
将返回所有位串的有序序列,其差异为k
or k-1
.
我知道,还不是很有趣,但是你可以修改k
位,以及inc()
将始终返回具有最大允许编辑差异的所有排列关于m0
and m1
.
现在,为了得到all排列,您将不得不使用所有可能的组合重新运行算法m0
and m1
.
示例:获取所有可能的排列0110
与编辑距离2
,您必须使用以下排列来运行 inc()m0=0110
and m1=0110
(为了获得排列,必须有一个位位置expanded, 意思是m0
被设定为0
and m1
被设定为1
:
- 位 0 和 1expanded:
m0=0010
and m1=1110
- 位 0 和 2expanded:
m0=0100
and m1=1110
- 位 0 和 3expanded:
m0=0110
and m1=1111
- 位 1 和位 2expanded:
m0=0000
and m1=0110
- 位 1 和位 3expanded:
m0=0010
and m1=0111
- 位 2 和位 3expanded:
m0=0100
and m1=0111
作为起始值h_0
我建议简单地使用m0
。迭代可以中止一次inc()
回报m1
.
Summary上述算法生成O(x) all x
至少有差异的二元向量y
来自给定向量的位(可配置)v
.
使用你的定义n
=number of bits in a vector v
, 环境y=n
生成 1 个与输入向量完全相反的向量v
. For y=n-1
,它会生成n+1
向量:n
除一位以外所有位均不同的向量和所有位均不同的 1 个向量。等等不同的值y
.
**编辑:在上面的文本中添加了摘要并用“NEGATE”替换了错误的“XOR”。