优化的方法将数组中的所有浮点元素添加到另一个数组中的每个浮点数

时间:2017-04-06 08:35:24

标签: c++ arrays math logic

到目前为止我提出的代码是

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)。如何改进?

3 个答案:

答案 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),其中nm的大小分别为xy

答案 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;
    }
}