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年来做计算,给出或采取一个宇宙的生命周期。

您可能需要一个更好的策略来找到正确的解决方案,而不是一个暴力枚举的所有可能性。