Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 生成0和x27的所有组合;s和1';对于给定长度,最小值和最大值为1';给_Algorithm_Combinations - Fatal编程技术网

Algorithm 生成0和x27的所有组合;s和1';对于给定长度,最小值和最大值为1';给

Algorithm 生成0和x27的所有组合;s和1';对于给定长度,最小值和最大值为1';给,algorithm,combinations,Algorithm,Combinations,我想知道是否有一个有效的算法来生成长度为n的0和1的所有组合,给定1的最小值和最大值 例如: n=4最小值=2最大值=3 0011 0101 1001 0110 1010 1100 (with 2 1's) 0111 1011 1101 1110 (with 3 1's) 我知道我可以用二进制从(n-min)*0(min)*1到(max)*1(n-max)*0(例如0011到1110)进行计数,并取所有 满足约束条件,但我想知道是否有更有效的算法 有一个简单的算法可以迭代大

我想知道是否有一个有效的算法来生成长度为n的0和1的所有组合,给定1的最小值和最大值

例如:

n=4最小值=2最大值=3

0011 0101 1001 0110 1010 1100 (with 2 1's)
0111 1011 1101 1110           (with 3 1's)
我知道我可以用二进制从(n-min)*0(min)*1到(max)*1(n-max)*0(例如0011到1110)进行计数,并取所有
满足约束条件,但我想知道是否有更有效的算法

有一个简单的算法可以迭代大小
n
k
的组合:

  • 从长度为
    n
    的位向量开始,其中最后的
    k
    位是
    1
  • 尽可能长地重复(即,直到得到长度为
    n
    的位向量,其中第一个
    k
    位为
    1
    ): A.查找位向量中的最后一个
    01
    序列。将其更改为
    10
    ,并将以下所有
    1
    位(必须紧跟其后)移动到序列末尾

  • 有一个简单的无循环位操作黑客可以做到这一点。你可以在我对这个问题的回答中看到:

    也许我误解了什么,但如果我按照你在我得到的链接中描述的策略:@rex123:我想你的评论被截断了。'0011->0101->1001->1010->1100->0111->1011->1101->1110',这意味着我遗漏了什么。我想我不明白如果'1'不是紧接在'01'之后该怎么办。@rex123:在
    0101
    中,最后一个
    01
    在末尾,因此下一个组合是
    0110
    1
    必须紧跟在最后一个
    01
    之后,因为如果有
    1
    ,而它们不紧跟在最后一个
    01
    之后,那么它们必须紧跟在其他
    0
    之后,所以最后一个
    01
    不能是最后一个
    01
    ,这是矛盾的证明。这两个序列是:
    0011
    0101
    0110
    1001
    1010
    1100
    。这是你自己发现的还是有什么理论依据?如果是,我应该看什么?