是否有更快的方法可以在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;
这种编码发生在对大型数据集的实际分析中,非常耗时。任何建议将不胜感激。
答案 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";
}
您的代码在计算的内容基本上如下:
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