我必須報告傳入數字的平均值,我怎麼能做到這一點,而不使用某種數據結構來跟蹤所有值,然後通過求和和除以值的數量來計算平均值?平均越來越多的變量
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. PHP變量汽車越來越多
- 3. 類變量越來越重
- 4. 越來越不確定變量的NodeJS
- 5. PDO越來越不確定的變量
- 6. 全球變量越來越dereferanced
- 7. 越來越ReferenceError:找不到變量:angular
- 8. 越來越多的機會
- 9. 得到越來越多的變量從PHP到jquery
- 10. SmtpClient變得越來越慢
- 11. C#Event Handlers越來越多
- 12. Java數組越來越多
- 13. JSF1064獲得越來越多
- 14. BerkeleyDB越來越胖,越來越慢
- 15. 的UITableView變得越來越小
- 16. OAuth的變化歇越來越餅乾
- 17. 越來越多行與許多IDS
- 18. 的NetLogo - 越來越多的領土
- 19. 的XPath越來越
- 20. 越來越
- 21. 越來越CursorIndexOutOfBoundsException
- 22. 越來越hibernate.QueryException,
- 23. 越來越
- 24. 越來越java.lang.NoSuchMethodError
- 25. 越來越
- 26. 越來越java.lang.classCastException:android.os.Bundle
- 27. 越來越以 '/'
- 28. 越來越java.lang.ArrayIndexOutOfBoundsException
- 29. 越來越org.springframework.web.bind.MissingServletRequestParameterException
- 30. 越來越
http://stackoverflow.com/questions/895396/how-do-i-find-在一個大的數字集合 – PRR 2010-06-02 09:09:43