添加二维数组列表的组合

时间:2011-11-17 00:03:44

标签: java multidimensional-array combinations

所以我正在解决的问题涉及整数数组列表的数组列表 。众所周知:每个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数组添加到数组数组中。

2 个答案:

答案 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;
    }
}