所以我正在解决的问题涉及整数数组列表的数组列表 。众所周知:每个ArrayList中的整数元素数。什么是未知的:实际上有多少个整数ArrayList。我需要一个算法的建议,该算法可以在数组的每个可能组合中对这些数组的(有序)元素求和。为了澄清我的意思,让我举一个例子:
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];农产品协议[2] +的AoA [3];
(4选2)
因此,如果有人能编写这个简单的版本,我会很感激,因为我正在努力做到这一点。如果有人可以编写更复杂的例子,其中AoA中存在未知数量的数组(所以N选择2),那么你就是我的英雄。
TL; DR /编辑
我需要一个算法从数组数组中取n-choose-2数组;对数组求和(例如[1,2,3] + [1,2,3] = [2,4,6]);把新的summed数组添加到数组数组中。
答案 0 :(得分:0)
如果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++;
}
}
答案 1 :(得分:0)
这就是我所拥有的,花了我一段时间,但这将做我想要的: 它需要数组的每个组合(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;
}
}