我需要计算向量内值的平均值、中位数和标准差。我可以对向量进行排序以找出中位数,但有没有更简单的方法来找到平均值和标准差而不是添加东西?
3 回答
你可以用 找到中位数std::nth_element
。与(显然)流行的看法相反,这通常比排序更快,然后找到中间元素——通常是 O(N)(线性),而排序通常是 O(N log N)。
要添加均值的元素,您可以使用 ust std::accumulate
,例如:
double total = std::accumulate(std::begin(v), std::end(v), 0.0);
[注意:根据您的编译器的年龄,您可能需要使用v.begin()
andv.end()
而不是begin(v) and
end(v)`)。]
计算方差已在前面的问题中讨论过。标准偏差只是方差的平方根。
为了找到平均值,您只需将向量内容相加即可。您可以在不首先对向量进行实际排序的情况下找到中位数,但是用于计算未排序向量中位数的算法几乎肯定会比排序复杂得多。另外,我很确定,如果您计算在未排序的向量上找到中位数的时间,几乎可以肯定它会超过排序和提取中位数的总时间。(如果你只是为了技术挑战,我会为你写一个......)
由于您可能必须对向量进行排序,因此您可以在排序时计算平均值。
编辑:没有看到 C++ 标签!
如果您使用的是提供函数式编程工具的语言,则可以使用 + 函数对向量进行折叠,然后除以其长度以获得平均值。
对于 stddev,您可以使用 lambda : x -> (x - mean)^2 并用 + 折叠结果。
它的计算效率并不高,但它可能会节省很多开发人员的时间!