【问题标题】:generate all combinations of 0's and 1's for a given length with min and max 1's given为给定长度生成 0 和 1 的所有组合,其中 min 和 max 1 给定
【发布时间】:2013-06-02 21:34:16
【问题描述】:

我想知道在给定最小和最大数量的 1 的情况下,是否有一种有效的算法可以生成长度为 n 的 0 和 1 的所有组合。

例子:

n=4 min=2 max=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)并取所有这些那 满足约束,但我想知道是否有更有效的算法。

【问题讨论】:

    标签: algorithm combinations


    【解决方案1】:

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

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

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

    【讨论】:

    • 也许我误解了一些东西,但如果我遵循您在链接中描述的策略,我会得到:
    • @rex123:我认为你的评论被截断了。
    • '0011 -> 0101 -> 1001 -> 1010 -> 1100 -> 0111 -> 1011 -> 1101 -> 1110' 这意味着我错过了一些东西。我想我不明白如果 '1' 不是紧跟在 '01' 之后该怎么办。
    • @rex123:在0101 中,last 01 在末尾,所以下一个组合是01101 必须紧跟最后一个 01,因为如果有 1 并且它们不紧跟最后一个 01,那么它们必须紧跟其他一些 0,所以最后一个01 不能是最后一个 01,矛盾的证明。 2序列是:001101010110100110101100
    • 这是您自己发现的还是背后有什么理论?如果是这样,我应该看什么?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多