到目前为止我提出的代码是
void sumValues()
{
float sum = 0;
int n = NUM_ELEMENTS;
for (int i = 0; i < n; i++)
{
float x = dataX[i];
for (int j = 0; j < n; j++)
{
float y = dataY[j];
float val = x + y;
sum += val;
}
}
}
我需要知道的是,如何优化此代码?
当做这种逻辑时,你必须走两个列表的所有元素,所以至少它必须是O(n ^ 2)(AFAIK)。如何改进?
答案 0 :(得分:3)
您不清楚自己要做什么:标题建议您想要获取数组A中的所有int值,计算它们的总和,并将其添加到数组B中的每个元素。其复杂程度为O(n)。
你的代码不这样做:对于所有(x,y)对,其中x在A中,而在y中在B中,它计算x + y并将其加到总和中。您实际上可以注意到最终总和将是n*(Sum(A) + Sum(B))
,您也可以在O(n)中计算。但我怀疑那是你想要做的......
答案 1 :(得分:2)
如有疑问,请使用算术。
你正在计算
(x[0] + y[0]) + (x[0] + y[1]]) + ... + (x[0] + y[n-1])
+ (x[1] + y[0]) + (x[1] + y[1]]) + ... + (x[1] + y[n-1])
...
+ (x[n-1] + y[0]) + (x[n-1] + y[1]]) + ... + (x[n-1] + y[n-1])
是
n * x[0] + y[0] + y[1] + ... + y[n-1]
+ n * x[1] + y[0] + y[1] + ... + y[n-1]
...
+ n * x[n-1] + y[0] + y[1] + ... + y[n-1]
是
n * x[0] + sum(y)
+ n * x[1] + sum(y)
...
+ n * x[n-1] + sum(y)
是
n * (x[0] + x[1] + ... + x[n-1]) + n * sum(y)
是
n * sum(x) + n * sum(y)
或
n * (sum(x) + sum(y))
这是O(n + m)
,其中n
和m
的大小分别为x
和y
。
答案 2 :(得分:0)
由于sum(x)= X * Y1 + X * Y2 + ... X * YN,则sum(x)= X *(sum(Y)):
void sumValues()
{
float sum = 0;
int sumOf2ndArray = 0;
int n = NUM_ELEMENTS;
for (int i = 0; i < n; i++)
{
sumOf2ndArray += dataY[i];
}
for (int i = 0; i < n; i++)
{
float x = dataX[i];
sum += x * sumOf2ndArray;
}
}