2013-06-02 28 views
2

我想知道是否有一个有效的算法来生成0和1的长度为n的所有组合,给定最小和最大量1分的。生成给定长度的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-分钟)* 0(分钟)* 1到(最大计数)* 1(n-max)* 0(例如0011到1110)并且采取所有那些满足约束的那些,但是我想知道是否存在更有效的算法。

回答

2

有一个简单的算法用于与k那些迭代大小n的组合:

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

有一个简单的无循环位操纵hack来做到这一点。你可以在我对这个问题的回答中看到它:Find n-th set of a powerset

+0

也许我误解了某些内容,但是如果按照您在链接中描述的策略获得: – rex123

+0

@ rex123:我认为您的评论已被截断。 – rici

+0

'0011 - > 0101 - > 1001 - > 1010 - > 1100 - > 0111 - > 1011 - > 1101 - > 1110'这意味着我错过了一些东西。我想我不明白如果'1'不是在'01'之后立即做什么的。 – rex123

相关问题