数组中所有可能元素对的总和

时间:2015-02-18 23:35:32

标签: arrays algorithm

我试图解决问题,其中给出了一个整数数组,我需要找到给定数组中所有可能元素对的总和。 例如,数组是1,2,3,4 然后应该给1 + 2 + 1 + 3 + 1 + 4 + 2 + 3 + 2 + 4 + 3 + 4 = 30

现在,我尝试了不同的东西,但我不能使用任何复杂度小于O(n ^ 2)的算法。有没有人对复杂度小于O(n ^ 2)

的算法有所了解

3 个答案:

答案 0 :(得分:11)

由于数组的每个元素都以n-1对完成,因此将它们加起来并乘以n-1,这意味着O(n)


这实际上推广到需要所有k元素多重集合之和的情况。在这种情况下,数组的每个元素都出现在(n-1) choose (k-1)多个集合中,因此将它们全部加起来并乘以它。二项式系数的计算在某些时候可能会变得有点多,但绝对可以枚举所有k元素多重集合并将它们相加。

答案 1 :(得分:-1)

除非你对数组中的值有所了解,否则我认为没有任何办法可以做到不是O(n ^ 2)。

每次2个项目的组合数量为:

N           C
10          45
100       4950
1000    499500

正如你所看到的,组合的数量大约为(N ^ 2)/ 2,所以我看不出如果没有额外的信息你可以做得更好。

答案 2 :(得分:-1)

在c ++中有一个名为next_permutation()的函数,它在数组中生成元素的下一个“组合”。所以你可以这样做:

int A=[1,2,3,4,5];
while(next_permutation(A,A+5)) //NOTE: A is pointer to first element of array A
{
    // do something
}

如果你明白了,你应该能够为你的问题定制代码。