我必须报告传入数字的平均值,我怎么能做到这一点,而不使用某种数据结构来跟踪所有值,然后通过求和和除以值的数量来计算平均值?平均越来越多的变量
0
A
回答
1
1
只要保持运行总和以及您已收到多少个数字,那就是您需要计算平均值的全部内容。
1
如果您有数字a[1] a[2] ... a[n]
,你知道它们的平均值为avg(n) = (a[1] + ... + a[n])/n
,然后当你另一个号码a[n + 1]
你可以这样做:
avg(n + 1) = (avg(n) * n + a[n + 1])/(n + 1)
某些浮点错误是不可避免的,但你要测试这个看看它是否够好。
为了避免溢出,你可以首先做了划分:
avg(n + 1) = (avg(n)/(n + 1)) * n + (a[n + 1]/(n + 1))
1
如果我不能完全错误的,我们可以计算出avg(n+1)
也这样说:所以乘
avg(n+1) = (a[1]+ ... + a[n+1])/(n+1) =
= (a[1]+ ... + a[n])/(n+1) + a[n+1]/(n+1) =
= (n(a[1]+ ... + a[n])/n)/(n+1) + a[n+1]/(n+1) =
= n*avg(n)/(n+1) + a[n+1]/(n+1) =
= n/(n+1) * avg(n) + a[n+1]/(n+1)
旧的平均值为n/(n+1)
,并添加新的元素除以n+1
。根据有多高n
将得到和你的价值观有多大,这可能会降低舍入误差...
编辑:当然,你必须使用浮点数计算n/(n+1)
,否则会始终呈现0 ...
0
你不需要跟踪总和,只有柜台:
class Averager {
float currentAverage;
size_t count;
float addData (float value) {
this->currentAverage += (value - this->currentAverage)/++count;
return this->currentAverage;
}
}
相关问题
- 1. 平均处理速度越来越慢
- 2. 越来越多的机会
- 3. SmtpClient变得越来越慢
- 4. C#Event Handlers越来越多
- 5. BerkeleyDB越来越胖,越来越慢
- 6. OAuth的变化歇越来越饼干
- 7. 的UITableView变得越来越小
- 8. 越来越以 '/'
- 9. 越来越org.springframework.web.bind.MissingServletRequestParameterException
- 10. 越来越
- 11. 越来越
- 12. 我越来越
- 13. 越来越元
- 14. 越来越多的日志数据
- 15. 越来越多的信号手柄
- 16. 越来越多的NSTableView行高度
- 17. ColdFusion越来越多的数字
- 18. 影像保存有越来越多的
- 19. 的getText是越来越触发多次
- 20. Azure越来越多的Sql数据库
- 21. 越来越不确定的变量错误laravel
- 22. 反复“越来越”变化int
- 23. JPA持续变得越来越慢
- 24. Java Swing Timer变得越来越快
- 25. getProperty()在Neo4j中变得越来越慢
- 26. 生成模式变得越来越长
- 27. For循环CMD越来越可变
- 28. 越来越触及
- 29. 越来越将XMLNode
- 30. 我越来越DoublerenderError
http://stackoverflow.com/questions/895396/how-do-i-find-在一个大的数字集合 – PRR 2010-06-02 09:09:43