如何快速有效地计算平均值(移动平均值)?

维特·贝纳提克

我想出了这个

n=1;
curAvg = 0;
loop{
  curAvg = curAvg + (newNum - curAvg)/n;
  n++;
}

我认为这种方式的重点是:
-避免大数(如果求和然后除法,可能会发生溢出)
-保存一个寄存器(无需存储和)

麻烦可能在于求和错误-但我认为一般来说,向上舍入和向下舍入的次数应该是平衡的,因此错误不会大幅度地累加。

您在此解决方案中看到任何陷阱吗?你有更好的建议吗?

用户名

您的解决方案本质上是“标准”的最佳在线解决方案,用于在不存储大笔费用的情况下保持平均运行轨迹,并且在“在线”运行时也可以运行,即您一次只能处理一个数字而不必返回其他数字,使用固定数量的额外内存。如果您想在数值精度方面进行稍微优化的解决方案(以“在线”为代价),则假设您的数字均为非负数,然后从小到大先对数字进行排序,然后按该顺序进行处理,您现在使用的相同方式。这样,如果您得到一堆很小的约相等的数字,然后得到一个大数,则与先处理大数相反,您将能够准确地计算平均值而不会发生下溢。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章