2016-02-11 69 views
-2

運行整數數組的所有不同排列的最有效算法是什麼?具體來說,我有一個數組,可以容納4個大小爲uint32_t的元素,但我需要在Java中實現它,所以我想我需要使用long來限制它在4,294,967,295。因此,輸出示例如下:運行整數數組的所有組合的算法

[1,1,1,1] 
[2,1,1,1] 
[3,1,1,1] 
[4,1,1,1] 
[1,2,1,1] 
[1,3,1,1] 
[1,4,1,1] 
[1,1,2,1] 
[1,1,3,1] 
[1,1,4,1] 
... 
[4,294,967,295, 4,294,967,295, 4,294,967,295, 4,294,967,295] 

它不需要按順序經過它。只要它嘗試所有組合。

謝謝!

+2

這些既不是排列組合,至少在技術意義上。 –

+0

此外,這將是'10^38'不同的可能性。 – lcs

+1

這很可能是一個XY問題......你試圖解決什麼是真正的問題?因爲用'int'需要很長時間,所以我甚至無法想象'long'需要多長時間...... – Tunaki

回答

1

只要幾個圈:

for (int a = 0; a != max_int; ++a) { 
    for (int b = 0; b != max_int; ++b) { 
     for (int c = 0; c != max_int; ++c) { 
      for (int d = 0; d != max_int; ++d) { 
       std::cout << a << b << c << d << std::endl; 
      } 
     } 
    } 
} 
+0

可能性太多,永遠不會完成。請注意,OP想要處理'long',而不僅僅是'int' ... – Tunaki

+0

@Tunaki,我試圖解決的問題是這些組合之一是正確的答案,但我不知道哪個。不幸的是,我只選擇很長時間,因爲在Java中沒有uint的概念:( –

+0

這就是_exactly_我​​擔心的事情,而且,你做錯了!你根本無法產生所有的可能性......也有很多,你試圖解決的問題必須從另一個角度來解決;蠻力並不是唯一的解決方案 – Tunaki

3

我希望你有耐心,因爲有相當多的可能的組合。

您不允許爲0,所以總數略小於2 可能的組合。其中只有4,294,967,295 或340,282,366,604,025,813,516,997,721,482,669,850,625。

所以,如果你每秒可以處理數十億次,那麼它只需要10,790,283,060,756,779,982,147年來做計算,給出或採取一個宇宙的生命週期。

您可能需要一個更好的策略來找到正確的解決方案,而不是一個暴力枚舉的所有可能性。