2015-04-05 149 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