【问题标题】:addition of combinations of two-dimensional array list添加二维数组列表的组合
【发布时间】:2011-11-17 00:03:44
【问题描述】:

所以我正在解决的问题涉及整数数组列表的数组列表 .已知:每个整数 ArrayList 中的元素数。未知的:实际上有多少个 ArrayList of Integers。我需要一种算法的建议,该算法将在每个可能的数组组合中对这些数组的(有序)元素求和。为了澄清我的意思,让我举个例子:

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];迎角[1]+迎角[3];迎角[2]+迎角[3];

(4选2)

因此,如果有人可以编写这个简单的版本,我将不胜感激,因为我正在努力做到这一点。如果有人可以编写更复杂的示例,其中 AoA 中有未知数量的数组(因此 N 选择 2),那么您就是我的英雄。

TL;DR/编辑

我需要一种算法来从数组数组中获取 n-choose-2 数组;对数组求和(例如 [1,2,3] + [1,2,3] = [2,4,6]);将新的求和数组添加到数组数组中。

【问题讨论】:

  • 问题大概不是加法。问题在于生成组合,对吗?
  • 如果您始终使用 ArrayLists,那么大小很容易通过 ArrayList.size() 调用确定。正如@OliCharlesworth 所说,这听起来像是一个组合问题。
  • 2 in (N choose 2) 是固定的吗?
  • 这个问题很不清楚。如果你有数据结构,那么你就知道有多少个 ArrayList。您是否只是想要一种算法来获取可以从 0..n-1 中选择的 n-choose-2 对数字,以便将这些对用作索引?需要编辑问题。
  • @OliCharlesworth 等人。 : 对,那是正确的。我正在寻找算法来选择 n-choose-2 数组然后执行加法。

标签: java multidimensional-array combinations


【解决方案1】:

如果 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++;
  }
}

【讨论】:

  • 最后一个 for 循环中的 M 变量是什么?
  • M = int 数组中的元素数,您提到的就是已知的。
  • 好的,我还没有测试你的代码,但它看起来与我正在考虑的相似,但是你使用了 3 和一个带增量器的 c 而不是使用 4 个 for 循环。那么在 N 和 M 都 = 4 的情况下,这个新的 AoA 总和将在其中包含 6 个数组以及这段代码?
  • 在我的脑海中通过它看起来它会创建 (N*N(-1)) 行而不是 N*(N-1)/2 行;如果只是试图理解算法,这不是什么大问题。
  • 好吧,让我们看看N=5 会这样:(i=0,j=1,2,3,4) (i=1,j=2,3,4) , (i=2,j=3,4),(i=3,j=4)。 10 个结果 = (5*4/2)
【解决方案2】:

这就是我所拥有的,花了我一段时间,但这将满足我的需求: 它采用数组(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;
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-30
    相关资源
    最近更新 更多