2015-04-05 114 views
2

我的目标是遍历给定数量的1和0的所有组合。再说了,如果我给5号,这将是一个足够快的方式列出遍历所有可能的组合

1110100100, 1011000101等

我试图(5 1和5 0的每个不同组合)避免遍历所有可能的排列,并检查5 1是否存在,因为2^n远大于(n选择n/2)。谢谢。

+0

你只需要列出它们或在某处使用它们? – Sinstein 2015-04-05 17:56:00

+0

我必须使用它们,但是如果我可以列出它们,那很好,因为我可以简单地替换cout与我计划在其中执行的功能的任何位置。 – 2015-04-05 17:59:46

回答

0

你可以改变这个问题。如果您修复了1(反之亦然),那么这只是您将0的位置放在哪里的问题。对于5 1 s,有5 + 1个垃圾箱,并且您希望将5个元素(0 s)放入垃圾箱中。

这可以通过每个bin的递归和每个bin的循环来解决(把0 ... reaming元素放在bin中 - 除了最后一个bin,你必须放置所有remaning元素)。

0

想想它的另一种方法是作为string permutation question的一个变体 - 只需构建一个长度为2n的向量(例如111000),然后使用相同的算法进行字符串置换以生成结果。

请注意,天真的算法会打印重复的结果。然而,该算法可以很容易地适应忽略这样的重复,通过在递归函数中保留布尔数组来保持为特定位设置的值。

+0

即使您忽略它仍然是2 *(n!)额外的工作。 – 2015-04-05 18:16:59

+0

重复是这个问题,因为会有数以百万计的重复'n',但没有重复最需要检查的是几千(假设n不是非常大,在我的情况下它不会没那么大)。我不确定你想要实现什么布尔数组,for循环迭代次数太多 – 2015-04-05 18:18:06

+0

如果所有字符(位)具有不同的值,那么算法的复杂性将是(2n)!.但是,这绝对不是这种情况。在优化的算法中,您选择一个字符(位),将其固定在第x个位置,并记住您使用了该位。那么如果你选择另一个已经用于这个位置的char(位),那么你只需返回。因此,虽然这可能不是这个问题的最佳算法,但它的复杂性预计是合理的。 – 2015-04-05 18:24:52