如何在C ++中进行耗时的三重组合

时间:2018-08-07 21:02:11

标签: c++ optimization

是否有更快的方法可以在C ++中完成以下三重组合

const short n = 1000;
float a[n];⋅
for(int i = 0; i<n; i++)⋅
    a[i] = (float)i;

int b = 0;
for(int i = 0; i<n; i++)
    for(int j = 0; j<n; j++)
        for(int m = 0; m<n; m++)
            b += a[i]*a[j]*a[m];

cout<<"b: "<<b<<endl;

这种编码发生在对大型数据集的实际分析中,非常耗时。任何建议将不胜感激。

1 个答案:

答案 0 :(得分:3)

从数学上讲,您的乘积之和可以简化为立方体的总和。

因此您可以改用它:

// assuming a is an std::vector or similar
b = std::accumulate(a.begin(), a.end(), 0);
b = b*b*b;

您可以通过以下代码来说服自己:

#include <iostream>
#include <array>
#include <numeric>

int main()
{
    auto a = std::array{2, 3, 5, 7};

    auto sum = 0;
    for (auto i : a) {
        for (auto j : a) {
            for (auto k : a) {
                sum += i*j*k;
            }
        }
    }

    std::cout << sum << "\n";

    sum = std::accumulate(a.begin(), a.end(), 0);
    std::cout << sum*sum*sum << "\n";
}

Live on Coliru

您的代码在计算的内容基本上如下:

sum{i in a}( sum{j in a}( sum{k in a}( i*j*k ) ) )

而简化为:

sum{i in a}( i*sum{j in a}( j*sum{k in a}(k) ) )
sum{i in a}( i*sum{j in a}(j)*sum{k in a}(k) )
sum{i in a}(i)*sum{j in a}(j)*sum{k in a}(k)
sum{i in a}(i) ^3