所以我正在解决的问题涉及整数数组列表的数组列表. 已知内容:每个整数数组列表中的元素个数。未知的是:实际有多少个整数数组列表。我需要一个算法的建议,将这些数组的(有序)元素在数组的每一个可能的组合求和。为了更清楚地说明我的意思,让我举一个例子:
AoA = [[1,0,1,0],[0,1,0,1],[1,1,1,1],[0,0,0,0]];
AoA[0] + AoA[1]元素之和;AoA [0] + AoA [2];AoA [0] + AoA [3];AoA [1] + AoA [2];AoA [1] + AoA [3];AoA [2] + AoA [3],
(4选2)
所以如果有人可以编码这个简单的版本,我会很感激,因为我正在努力做到这一点。如果有人能编写更复杂的例子,在AoA中有未知数量的数组(所以N选择2),你就是我的英雄。
TL;博士/编辑
我需要一个算法从数组的数组中取n- choice -2个数组;和数组(如[1,2,3]+ [1,2,3]= [2,4,6]);
如果2是固定的,那么我能想到的最简单的事情就是生成具有N*(N-1)/2
行的新数组,每个求和一个,然后使用两个变量遍历原始数组,例如:s
int c = 0;
for (int i = 0; i < N; i++) {
for (int j = i + 1; j < N; j++) {
for (int k = 0; k < M; k++) {
sums[c][k] = AoA[i][k] + AoA[j][k];
}
c++;
}
}
这是我得到的,花了我一段时间,但这将做我正在寻找的:它获取数组(t1, t2, t3, t4)的每个组合,并将它们的元素相加,然后返回您为n选择的任何组合(在本例中我将其保留为3)。
如果有更多的优化,你可以看到,请随时添加它。我是一个perl爱好者,所以在Java中使这个工作是一个真正的任务。
import java.util.ArrayList;
public class testnCk {
public static void main(String[] args) {
ArrayList<int[]> sums = new ArrayList<int[]>();
int [] t1 = {1,1,0,0};
int [] t2 = {1,0,0,1};
int [] t3 = {0,0,0,0};
int [] t4 = {0,0,1,1};
ArrayList<int[]> testing = new ArrayList<int[]>();
testing.add(t1);
testing.add(t2);
testing.add(t3);
testing.add(t4);
int n = 3;
int i = -1;
int[] array = new int[4];
ArrayList<int[]> whatever = nCk(testing, sums, array, i, n);
for (int[] test1 : whatever)
{
for (int j = 0; j < test1.length; j++) {
System.out.print(test1[j]);
}
System.out.println();
}
}
public static ArrayList<int[]> nCk (ArrayList<int[]> arrayOfDiffPatterns, ArrayList<int[]> solutions, int[] tempsums, int i, int n)
{
n--;
for (int j=i+1; j<arrayOfDiffPatterns.size(); j++){
int[] array = tempsums.clone();
for (int k=0; k<arrayOfDiffPatterns.get(0).length; k++){
array[k] += arrayOfDiffPatterns.get(j)[k];
}
if(n>0){
nCk(arrayOfDiffPatterns, solutions, array, j, n);
}
else{
solutions.add(array);
}
}
return solutions;
}
}