c++ - C++中的排列

标签 c++ permutation

我有一个包含一些值的数组,例如

A=[a,b,c];

在 c++ 中计算以下内容的最简单/最快的方法是什么:

int SUM;
SUM= a*b + a*c + b*a + b*c + c*a + c*b;

在这种情况下 a*c != c*a

在实际情况下,我有不同大小的大数组,并将从其他数组中获取 a、b 和 c 的值。

/提前致谢

最佳答案

也许是这样(假设你真的想同时添加 a * b 和 b * a):

for (int i = 0; i < array_size - 1; ++i) {
    for (int j = i + 1; j < array_size; ++j) {
        sum += a[i] * a[j] * 2;
    }
}

甚至可能是一个更聪明的版本,可以降低算法的复杂性(O(n) vs O(n*n)):

对于数组中的每个成员 a[x],你要加起来:

a[0] * a[x] + a[1] * a[x] + ... + a[n] * a[x] - a[x] * a[x]

在分解出公因数后与:

a[x] * (a[0] + a[1] + ... + a[n] - a[x])

现在所有数组项的总和可以只计算一次:

int array_sum = std::accumulate(a, a + array_size, 0);  //#include <numeric> or use a simple loop
int sum = 0;
for (int i = 0; i < array_size; ++i) {
    sum += a[i] * (array_sum - a[i]);
}

关于c++ - C++中的排列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2228751/

相关文章:

r - 随机化二进制对角矩阵的最佳方法,保持 1 偏离对角线

lisp - 生成列表的排列

c++ - 返回一个即将在函数中销毁的变量

c++ - 在 if 语句中使用 != 运算符来检查两个条件

c++ - 链接 ssl 库

javascript - 如何从一系列数组中找到所有排列,这些数组在 javascript 中充当行和列?

c++ - 如何使用 Eclipse/CDT 并行构建项目(不是并行编译!)

c++ - 错误 : incompatible types in assignment of 'int' to 'char [1]' in GEANY

algorithm - 如果排列的子数组被反转,排列中的反转次数?

JavaScript - 从具有 m 个元素的 n 个数组生成组合