【问题标题】:How to generate all binary patterns of length n with k bits set ? (using recursion)如何生成所有长度为 n 且设置了 k 位的二进制模式? (使用递归)
【发布时间】:2018-02-12 06:18:26
【问题描述】:

我想编写一个函数来生成所有长度为 n 且设置了 k 位的二进制模式。这些模式可以存储在二维数组中。看起来我需要递归来实现这一点。任何代码或伪代码都会有所帮助。

示例:如果 n=5 和 k=3 生成:

11100
11010
11001
10110
10101
10011
01110
01101
00011
00111

我发现了类似的帖子:Generate all binary strings of length n with k bits set,但建议的解决方案计算所有 2^k 组合。

【问题讨论】:

  • 这肯定是和stackoverflow.com/questions/46023719/… 相同的问题,只是几个小时前问的? (递归请求除外,这对于高效实现来说绝对不是必需的。)
  • 此外,您链接的问题的已接受答案 not 会生成所有 2^k 组合。你试过了吗?
  • @rici 对我链接到的问题的接受答案,将数字作为输入:unsigned int v; // 当前位的排列 unsigned int w; // 下一个位排列
  • @David,那个参数 v 只是前面的排列。用第一个数字调用它很容易,然后用函数返回的前一个结果继续调用它。该问题还有其他几个有用的答案。这是一个骗局。

标签: algorithm recursion binary bit-manipulation


【解决方案1】:
For i = 0...(1<<n)-1
    If countsetbits(i) == k
        Store into collection

countsetbits(i) 在哪里:

j = i
For b = 0...n
    If j == 0
        Return b
    j = j And (j - 1)

以你的例子,其中

n = 5, k = 3

你得到

i     b j=0? j     And(j-1)          Return b   Main loop
0...6                                           less than k
7     0 No   111b  And 110b = 110b  
      1 No   110b  And 101b = 100b  
      2 No   100b  And 011b = 000b  
      3 Yes                          3          k, hence store into collection
8     0 No   1000b And 0111b = 0000b
      1 Yes                          1          less than k
9     0 No   1001b And 1000b = 1000b
      1 No   1000b And 0111b = 0000b
      2 Yes                          2          less than k
10    0 No   1010b And 1001b = 1000b
      1 No   1000b And 0111b = 0000b
      2 Yes                          2          less than k
11    0 No   1011b And 1010b = 1010b
      1 No   1010b And 1001b = 1000b
      2 No   1000b And 0111b = 0000b
      3 Yes                          3          k, hence store into collection
...
31    ...                            5          greater than k

【讨论】:

  • 谢谢。但这不是运行 2^n 次迭代吗?这是我要避免的。
【解决方案2】:

这个任务的递归实现很简单(Delphi和伪代码)

  procedure GenKBits(Value, Position, N, K: Integer);
  begin
    if K = 0 then
      Output Value in binary
    else
      if (Position < N) then begin
        GenKBits(Value or (1 shl Position), Position + 1, N, K - 1); //set bit
        GenKBits(Value, Position + 1, N, K);             //use zero bit
      end;
  end;

call  GenKBits(0, 0, 4, 2) gives

0011
0101
1001
0110
1010
1100

【讨论】:

    猜你喜欢
    • 2010-12-23
    • 2013-11-08
    • 1970-01-01
    • 2011-12-04
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    相关资源
    最近更新 更多