关于队列和标准差

时间:2014-11-20 14:30:23

标签: algorithm

我不确定这个问题会在哪里发生,因为它听起来像数学,但由于编程性质,我仍然决定把它放在这里。

我有一个常量大小的队列,可以将数据加载回来并从前面弹出数据(保持大小不变​​),我想要队列的标准差(sigma)。我知道for循环实现对于这很容易,但是当大小变大时,时间会变得非常糟糕。有更好的实施吗?

2 个答案:

答案 0 :(得分:2)

由于公式std dev = sqrt(E(x^2)-E(x)^2) (proof on wikipedia),您可以将有效方法用于标准差的平均值。

换句话说,跟踪值的平方和(例如,在变量sum_of_squares中),并跟踪值的总和(例如,在变量sum_of_values中)。在这两种情况下,您都可以通过添加一个值并删除旧值来更新O(1)中的变量。

然后标准偏差可以计算为:

mean = sum_of_values/n
std_dev = sqrt( sum_of_squares/n - mean*mean )

答案 1 :(得分:0)

你可以通过维护3个变量来做到这一点:N是数字,M是均值,V是方差,队列中的每个元素。

如果以空队列开头,则N = 0,M = 0.0且V = 0.0。

将元素x添加到队列中(dx和f是本地人)

N += 1;
f = 1.0/N;
dx = x - M;
M += f*dx;
V = (1.0-f)*(V+f*dx*dx);

从队列中删除元素x

N -= 1
if ( N == 0)
{   M = 0.0; V= 0.0;
}
else
{   f = 1.0/N;
    dx = x - M;
    M -= f*dx;
    V = (1.0+f)*(V - f*dx*dx);
}