如何优化获得数组的平均值?

时间:2018-03-14 16:58:10

标签: c++ optimization

有一个函数从开头到i + 1返回所有元素的平均值。

std::vector<double> f(const std::vector<double> &v)
{
    std::vector<double> ret(v.size());

    for (size_t i = 0; i < v.size(); ++i) {
        ret[i] = std::accumulate(v.begin(), v.begin() + i + 1, 0.0) / (i + 1);
    }

    return ret;
}

如何优化此功能?

2 个答案:

答案 0 :(得分:6)

您不需要在每次迭代时从头开始重新计算总和。只需保留一笔运行金额。

std::vector<double> f(const std::vector<double> &v)
{
    std::vector<double> ret(v.size());

    double cur = 0.;
    for (size_t i = 0; i < v.size(); ++i)
    {
        cur += v[i];
        ret[i] = cur / (i + 1);
    }

    return ret;
}

这甚至适合在原地工作,所以如果来电者不介意丢失源矢量,它可以避免额外的分配。

void f_inplace(std::vector<double> &v)
{
    double cur = 0.;
    for (size_t i = 0; i < v.size(); ++i)
    {
        cur += v[i];
        v[i] = cur / (i + 1);
    }
}

答案 1 :(得分:4)

使用std::partial_sum

std::vector<double> f(const std::vector<double> &v)
{
    std::vector<double> ret(v.size());

    std::partial_sum(v.begin(), v.end(), ret.begin());
    for (size_t i = 0; i < ret.size(); ++i) {
        ret[i] /= i + 1;
    }

    return ret;
}