C中的组合求和

时间:2014-07-16 10:57:13

标签: c combinations cartesian-product large-data

让我们说我们有4个应用程序可以产生100个数据点。所以,现在我们总共有400个数据点。 但是,如果我们想要找出以下所有情况下数据点的总和 100 * 100 * 100 * 100。你会怎么做?

每个应用程序的100个数据点采用[a][b]类型的数组形式,其中a和b为10,10。

因此,对于每个应用程序,对于给定的数据点,它是[app][a][b]。 总结似乎很简单:[app][a][b]+[app1][a][b]...

但是,这就是我被困住的地方。我不知道如何获得总数的组合 如何计算C中数据组合的总和......即100*100*100*100数据集。

我在这里错过了一些数学。如果你能在这里帮助我,那就太好了。

编辑:

app0 [[17, 24, 85, 43, 4], [92, 6, 17, 62, 20], [72, 100, 59, 84, 67]]
app1 [[83, 8, 95, 74, 61], [95, 84, 15, 70, 89], [6, 91, 13, 85, 43]]
app2 [[88, 98, 86, 52, 32], [37, 1, 96, 43, 72], [10, 62, 76, 100, 35]]

possible data sets are
17+83+88
17+83+98
....
17+83+37
...

2 个答案:

答案 0 :(得分:1)

我不确定我是否正确使用了这个,所以如果我错了就纠正我:

你有X = 4数量的...... ,让我们说;然后每个表都有Y = 10,每行有Z = 10。您将从每个表中获取一个元素并将它们一起添加。每次将X = 4个元素添加到一起时,每个表中都会有一个元素。您希望将这些总和分组,然后将这些总和一起添加到更大/最终总和中。我是对的吗?

如果是这样,这意味着最终您将得到(Y * Z) ^ X,即(10 * 10) ^ 4 = 100 000 000给定值的个别总和,您将其视为组合在你的问题中,当他们实际上是每个组合的总和时。最后,你想要每个组合的总和,这就是你所追求的吗?

那么,这就是我在想的可以帮助你的东西:

a[tableindex][rowindex][columnindex]

应表示给定单元格中的数字,索引应为零。在生成每个组合的总和时,事情将如下所示:

a[0][row0][column0] + a[1][row1][column1] + a[2][row2][column2] + a[3][row3][column3]

表索引将保持不变,行索引和列索引中的每一个都会在0Y - 1 = 9之间的任何位置跳转到行,到列Z - 1 = 9。现在我想问你这个问题,我们会多久会遇到a[0][0][0]这个术语?

  • row0column0必须为0,不变。
  • row1row2row3的范围可以从09Y = 10可能的值。
  • column1column2column3的范围可以从09Z = 10可能的值。

可能性在数学中成倍增加,1 * 1 * (10 * 10 * 10) * (10 * 10 * 10) = 1 000 000就是答案。其通用公式可以写为(Y * Z) ^ (X - 1)(Y * Z),因为它是表中单元格的数量,提升到(X - 1)的幂,因为有许多表排除我们修复过的那个。

由于每个表具有相同数量的单元格,并且因为此示例将适用于每个单独的术语;您可以简单地将每个单元格添加到一起,然后将结果乘以(Y * Z) ^ (X - 1),这对于您的情况来说是一百万。如果你的数字足够小,不会导致溢出,那么下面的代码会这样做:

#define tablecount 4
#define rowcount 10
#define columncount 10

int main(int argc, char const *argv[])
{
    int a[tablecount][rowcount][columncount] = { 0 };

    // Assuming it gets filled somewhere in between

    int thenumber = 0;
    for (int table = 0; table < tablecount; table++)
        for (int row = 0; row < rowcount; row++)
            for (int column = 0; column < columncount; column++)
                thenumber += a[table][row][column];

    for (int i = 1; i < tablecount; i++)    // notice that the initial value for i is 1
        thenumber *= rowcount * columncount;

    return 0;
}

确保在中间填充数组,并在需要时包含适当的库。

答案 1 :(得分:0)

好的,现在我们已经掌握了基础知识,我们可以分析问题:

  

给定N行和M列的T表,使用每个表中恰好1个元素的所有可能总和的总和是多少。

我们有这样的模式:

17+83+88
17+83+98
....
17+83+37

请注意,在此模式中,对于剩余程序的每个其他组合,第一个循环中的数字17将存在一次。但究竟有多少?

第二个程序将发生100次不同的事件,并且第三个程序中的每个事件将发生100次,等等。

如果您只是从不同程序重新排序数据集,您将得到完全相同的模式,因此我们可以得出结论:所有可能组合的总和=(M * N)^(T-1)*(所有元素的总和) )。

我们可以把它写成三重for循环:

unsigned int T, N, M; // These are known.

//Assuming the input is of the form
float  data[T][M][N];

long double result = 0.0;

for (int app = 0; app < T; app++) {
    for (int row = 0; row < M; row++) {
        for (int col = 0; col < N; col++ ) {
            result += data[app][row][col];
        }
    }
}

result *= pow(N*M, T-1);