使用k个固定位生成排列

时间:2018-03-22 13:25:43

标签: permutation bit asymptotic-complexity

假设我有几个N位数,其中K(1

示例:N = 3,K = 1(中间位固定为“0”)。那么可能的排列是

000
001
100
101

假设我的数字 X = 000且数组 fixed = { - 1,0,-1}存储固定位信息(-1 =不是固定,0或1 =固定)。 简单的解决方案是生成所有排列 000,001,...,111并逐位遍历每一个并测试所有固定位是否具有正确的值(存储在 fixed 中)。如果至少有一个固定位与 fixed 中的对应值不同,则从结果中删除此排列。

然而,这是低效的,因为它需要2 ^ N而不是2 ^(N-K)排列。有没有一个算法或方法解决这个问题,只需要2 ^(N-K)个排列(直接在结果中)?

2 个答案:

答案 0 :(得分:0)

你使这个问题比现在更困难。

如果你看一下你的例子

000
001
100
101

这真的只是

00
01
10
11

其中固定零的第二个字段已被删除。

所以问题不是生成所有解决方案然后删除一些行,问题是只为变量字段生成解决方案然后插入固定字段。

答案 1 :(得分:0)

简单的比特技巧可以有效地解决这个问题。

制作二元面具:

A ,其中清除所有固定位(固定零和固定的!)并设置其他位

B ,其中设置了固定的

例如,x01x提供A = 1001, B = 0010

遍历A的所有子掩码,并在输出前设置B的固定子掩码:

 sm = A
 repeat:
      out = sm or B
     //use out bit combination  
      sm = (sm - 1) & A
 until (sm = 0)

此方法生成所有需要的位组合而无需过多的步骤