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