【问题标题】:Sum of all possible pairs of elements in an array数组中所有可能的元素对的总和
【发布时间】:2015-02-18 23:35:31
【问题描述】:

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

现在,我尝试了不同的方法,但我找不到任何复杂度小于 O(n^2) 的算法。有人知道复杂度小于 O(n^2) 的算法

【问题讨论】:

  • 不知道这个问题和编程有什么关系,试试 math.stackexchange.com
  • @Chiel 这是一个编程问题,我正在编写 java 程序,但我认为它背后一定有一些算法可以在少于 O(n^2) 的时间内解决它。
  • 对于不是 O(n^2) 的解决方案,是否需要额外的约束(即数组中的元素是连续整数等)?
  • @SnOrfus .. 不,没有其他限制.. 看看 G. Bach 的答案,它完美地给出了答案。

标签: arrays algorithm


【解决方案1】:

由于数组的每个元素都恰好出现在n-1 对中,因此将所有元素相加并乘以n-1,这意味着这是O(n)


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

【讨论】:

  • @G。巴赫非常感谢您的回复。这正是我想要的。
【解决方案2】:

除非您对数组中的值有所了解,否则我看不出任何不是 O(n^2) 的方法。

N个项目一次取2个的组合数为:

N           C
10          45
100       4950
1000    499500

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

【讨论】:

    【解决方案3】:

    在 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
    }
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-06
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2017-09-23
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多