发布时间:2021-09-28 10:33:53 阅读次数:210
我们在实际的开发中如果遇到很大数据量的求和,且累加和超过了uint64的存储范围.我们需要用到以下的解法进行求和.目前这种方式只适用于平均数在uint范围内,如果不在这个范围的考虑使用系统的函数库.
迭代法
迭代法是一种数学算法:
{Xi}进行平均数计算,总数为t.
将t换为c(t+1)为t+1个的平均数.
理解:
当均值计算到c(t)时,说明前t个数的均值为c(t).
x-c(t)得出x和c(t)的差值使得t+1个数的均值为c(t)然后将差值除以t+1,那么c(t)+差值/(t+1)得到的就是t+1的均值.
示例:
1 + 2 + 3
均值 1 (2-1)/2=0.5
1+0.5 1+0.5 (3-1.5)/3=0.5
1.5+0.5 1.5+0.5 1.5+0.5
2 2 2
1
2
3
4
5
归并法
算平均数可以按照这种思路进行求解,但是实现上需要额外的存储空间.而且实现代码较为复杂.
每两组求和计算平均数,如果最后余出的数不够一组那么前面的平均数需要乘以其数量占比然后加上不够一组的数的占比乘以该数.
1 + 2 | 1 + 2 | 1 + 2
3/2 3/2 3/2
(3/2 + 3/2)/2 3/2
3/2 3/2
3/2*2/3 + 3/2*1/3 占比乘积求和
1+1/2=1.5
————————————————