一个大量数据求均值的问题

数据很多,比如有几千万个,要求均值,
全部数据都是整数,范围0 ~ 255

如果简单的累加起来,使用long类型,加完之后再除以数据总个数,
这样求均值,求和时会溢出啊。有什么办法么?

避免溢出的同时,还要保证数据的精度不会损失才行..

(如果用浮点数的话是不是会损失精度呢?)


──── unfinished (Sun Apr 24 16:07:48 2005) ───────────

写个高精度算法
【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: 数据很多,比如有几千万个,要求均值,
: 全部数据都是整数,范围0 ~ 255
: 如果简单的累加起来,使用long类型,加完之后再除以数据总个数,
: 这样求均值,求和时会溢出啊。有什么办法么?
: 避免溢出的同时,还要保证数据的精度不会损失才行..
: (如果用浮点数的话是不是会损失精度呢?)


──── iWater (Sun Apr 24 16:13:12 2005) ─────────────

高精度算法是指什么呢?
能不能解释一下啊?

【 在 unfinished (moonriver) 的大作中提到: 】
: 写个高精度算法
: 【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: : 数据很多,比如有几千万个,要求均值,
: : 全部数据都是整数,范围0 ~ 255
: : 如果简单的累加起来,使用long类型,加完之后再除以数据总个数,
: : 这样求均值,求和时会溢出啊。有什么办法么?
: : 避免溢出的同时,还要保证数据的精度不会损失才行..
: : (如果用浮点数的话是不是会损失精度呢?)


──── kinfkong (Sun Apr 24 16:22:27 2005) ────────────

用一个数组保存数字,模拟笔算的样子
【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: 高精度算法是指什么呢?
: 能不能解释一下啊?
: 【 在 unfinished (moonriver) 的大作中提到: 】
: : 写个高精度算法


──── iWater (Sun Apr 24 16:24:42 2005) ─────────────

啊噢,会不会比较慢?

【 在 kinfkong (闭关赶论文) 的大作中提到: 】
:  用一个数组保存数字,模拟笔算的样子
: 【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: : 高精度算法是指什么呢?
: : 能不能解释一下啊?


──── unfinished (Sun Apr 24 16:25:16 2005) ───────────

java 的 BigInteger 和 BigDecimal 不错。
速度是慢一点
【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: 高精度算法是指什么呢?
: 能不能解释一下啊?
: 【 在 unfinished (moonriver) 的大作中提到: 】
: : 写个高精度算法


──── finalBob (Sun Apr 24 16:25:39 2005) ────────────


用__int64就可以

【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: 数据很多,比如有几千万个,要求均值,
: 全部数据都是整数,范围0 ~ 255
: 如果简单的累加起来,使用long类型,加完之后再除以数据总个数,
: 这样求均值,求和时会溢出啊。有什么办法么?
: 避免溢出的同时,还要保证数据的精度不会损失才行..
: (如果用浮点数的话是不是会损失精度呢?)


──── wwns (Sun Apr 24 16:30:48 2005) ──────────────

what about using "long count[256]"?
【 在 finalBob (Bob) 的大作中提到: 】
: 用__int64就可以
: 【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: : 数据很多,比如有几千万个,要求均值,
: : 全部数据都是整数,范围0 ~ 255
: : 如果简单的累加起来,使用long类型,加完之后再除以数据总个数,
: : 这样求均值,求和时会溢出啊。有什么办法么?
: : 避免溢出的同时,还要保证数据的精度不会损失才行..
: : (如果用浮点数的话是不是会损失精度呢?)


──── iWater (Sun Apr 24 16:33:54 2005) ─────────────

唔。。。

【 在 finalBob (Bob) 的大作中提到: 】
: 用__int64就可以
: 【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: : 数据很多,比如有几千万个,要求均值,
: : 全部数据都是整数,范围0 ~ 255
: : 如果简单的累加起来,使用long类型,加完之后再除以数据总个数,
: : 这样求均值,求和时会溢出啊。有什么办法么?
: : 避免溢出的同时,还要保证数据的精度不会损失才行..
: : (如果用浮点数的话是不是会损失精度呢?)


──── lingll (Sun Apr 24 19:11:35 2005) ─────────────

设有n个数,那么每m个分成一组,设 n= p*m + q ,q<=m,q>=0
对每一组求均值,可以控制m使得其和不会溢出,
然后将那些有m个元素的p组的数据的平均值再取平均,
即,假设这p组数据的均值为 a1,a2,...,ap,则 (a1+a2+...+ap)/p,
求得的值即为这 p*m个元素的均值,证明很简单,不写了,

那么现在我们得到的是,p*m个元素的均值,设为u,剩下的q个元素的均值,设为v
如果q=0,那么问题已经解决了,下面看看,若 q>0时:
其实所有数的均值会是以下等式的结果,(p*m*u+q*v)/(p*m+q)=i
要求p*m*u+q*v比较麻烦,但是求 (p*m*u+q*v)-(p*m*u+q*u)=q*(v-u)就简单多了
显然 q*(v-u)可以不溢出,
那么 i=((p*m*u+q*u)+q*(v-u))/(p*m+q)=u+(q*(v-u))/(p*m+q)
问题解决了

【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: 数据很多,比如有几千万个,要求均值,
: 全部数据都是整数,范围0 ~ 255
: 如果简单的累加起来,使用long类型,加完之后再除以数据总个数,
: 这样求均值,求和时会溢出啊。有什么办法么?
: 避免溢出的同时,还要保证数据的精度不会损失才行..
: (如果用浮点数的话是不是会损失精度呢?)


──── surcheng (Sun Apr 24 19:34:09 2005) ────────────

其实觉得换一个角度好像更加方便一些

设置一个long counter[256]的数组,和一个long的计数器,用于记录有多少个数据
,都初始化为0

因为数据总是在0-255之间,就将相应的数值为下标数组元素加1

循环完毕以后,就作一个循环将所有的值求平均加起来就可以了

例如总共有n个数据

那么就是

double total = 0.0;

for(int i=0;i<256;i++){

   total += 1.0*i*couter[i]/n;

}

总体的精度应该还算可以的,因为double型的精度已经足够高了

【 在 lingll ([0,-8)) 的大作中提到: 】
: 设有n个数,那么每m个分成一组,设 n= p*m + q ,q<=m,q>=0
: 对每一组求均值,可以控制m使得其和不会溢出,
: 然后将那些有m个元素的p组的数据的平均值再取平均,
: 即,假设这p组数据的均值为 a1,a2,...,ap,则 (a1+a2+...+ap)/p,
: 求得的值即为这 p*m个元素的均值,证明很简单,不写了,
: 那么现在我们得到的是,p*m个元素的均值,设为u,剩下的q个元素的均值,设为v
: 如果q=0,那么问题已经解决了,下面看看,若 q>0时:
: 其实所有数的均值会是以下等式的结果,(p*m*u+q*v)/(p*m+q)=i
: 要求p*m*u+q*v比较麻烦,但是求 (p*m*u+q*v)-(p*m*u+q*u)=q*(v-u)就简单多了
: 显然 q*(v-u)可以不溢出,
: .................(以下省略)


──── iWater (Sun Apr 24 19:55:06 2005) ─────────────

谢谢~~

【 在 lingll ([0,-8)) 的大作中提到: 】
: 设有n个数,那么每m个分成一组,设 n= p*m + q ,q<=m,q>=0
: 对每一组求均值,可以控制m使得其和不会溢出,
: 然后将那些有m个元素的p组的数据的平均值再取平均,
: 即,假设这p组数据的均值为 a1,a2,...,ap,则 (a1+a2+...+ap)/p,
: 求得的值即为这 p*m个元素的均值,证明很简单,不写了,
: 那么现在我们得到的是,p*m个元素的均值,设为u,剩下的q个元素的均值,设为v
: 如果q=0,那么问题已经解决了,下面看看,若 q>0时:
: 其实所有数的均值会是以下等式的结果,(p*m*u+q*v)/(p*m+q)=i
: 要求p*m*u+q*v比较麻烦,但是求 (p*m*u+q*v)-(p*m*u+q*u)=q*(v-u)就简单多了
: 显然 q*(v-u)可以不溢出,
: .................(以下省略)


──── coolzzz (Mon Apr 25 00:05:22 2005)   ────────────

long long咯
【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: 数据很多,比如有几千万个,要求均值,
: 全部数据都是整数,范围0 ~ 255
: 如果简单的累加起来,使用long类型,加完之后再除以数据总个数,
: 这样求均值,求和时会溢出啊。有什么办法么?
: 避免溢出的同时,还要保证数据的精度不会损失才行..
: (如果用浮点数的话是不是会损失精度呢?)


──── bbkills (Mon Apr 25 00:50:46 2005)   ────────────

这缺点是损失精度的。
【 在 lingll ([0,-8)) 的大作中提到: 】
: 设有n个数,那么每m个分成一组,设 n= p*m + q ,q<=m,q>=0
: 对每一组求均值,可以控制m使得其和不会溢出,
: 然后将那些有m个元素的p组的数据的平均值再取平均,
: 即,假设这p组数据的均值为 a1,a2,...,ap,则 (a1+a2+...+ap)/p,
: 求得的值即为这 p*m个元素的均值,证明很简单,不写了,
: 那么现在我们得到的是,p*m个元素的均值,设为u,剩下的q个元素的均值,设为v
: 如果q=0,那么问题已经解决了,下面看看,若 q>0时:
: 其实所有数的均值会是以下等式的结果,(p*m*u+q*v)/(p*m+q)=i
: 要求p*m*u+q*v比较麻烦,但是求 (p*m*u+q*v)-(p*m*u+q*u)=q*(v-u)就简单多了
: 显然 q*(v-u)可以不溢出,
: .................(以下省略)


──── iWater (Mon Apr 25 01:56:41 2005) ─────────────

oooooo~~ 那不损精度该如何呢?

【 在 bbkills (bill) 的大作中提到: 】
: 这缺点是损失精度的。
: 【 在 lingll ([0,-8)) 的大作中提到: 】
: : 设有n个数,那么每m个分成一组,设 n= p*m + q ,q<=m,q>=0
: : 对每一组求均值,可以控制m使得其和不会溢出,
: : 然后将那些有m个元素的p组的数据的平均值再取平均,
: : 即,假设这p组数据的均值为 a1,a2,...,ap,则 (a1+a2+...+ap)/p,
: : 求得的值即为这 p*m个元素的均值,证明很简单,不写了,
: : 那么现在我们得到的是,p*m个元素的均值,设为u,剩下的q个元素的均值,设为v
: : 如果q=0,那么问题已经解决了,下面看看,若 q>0时:
: : 其实所有数的均值会是以下等式的结果,(p*m*u+q*v)/(p*m+q)=i
: .................(以下省略)


──── lingll (Mon Apr 25 11:10:07 2005) ─────────────

四舍五入已经损失了精度了,
最后还是要看你对精度的要求有多高,
【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: oooooo~~ 那不损精度该如何呢?
: 【 在 bbkills (bill) 的大作中提到: 】
: : 这缺点是损失精度的。
: : .................(以下省略)


──── iWater (Mon Apr 25 11:11:31 2005) ─────────────

均値和前面的数据一样都是0 ~ 255整型

【 在 lingll ([0,-8)) 的大作中提到: 】
: 四舍五入已经损失了精度了,
: 最后还是要看你对精度的要求有多高,
: 【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: : oooooo~~ 那不损精度该如何呢?


──── surcheng (Mon Apr 25 11:57:07 2005) ────────────

那么你看看我的帖子吧,那样做是应该比较简单的
而且精度可以保证
【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: 均値和前面的数据一样都是0 ~ 255整型
: 【 在 lingll ([0,-8)) 的大作中提到: 】
: : 四舍五入已经损失了精度了,
: : 最后还是要看你对精度的要求有多高,


──── lingll (Mon Apr 25 12:24:09 2005) ─────────────

不明白,均值怎会一定是整型呢?
如 (1+2)/2=1.5,已经不是整型了

【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: 均値和前面的数据一样都是0 ~ 255整型
: 【 在 lingll ([0,-8)) 的大作中提到: 】
: : 四舍五入已经损失了精度了,
: : 最后还是要看你对精度的要求有多高,


──── iWater (Mon Apr 25 13:05:40 2005) ─────────────

嗯,谢谢~~

【 在 surcheng (风清扬) 的大作中提到: 】
: 那么你看看我的帖子吧,那样做是应该比较简单的
: 而且精度可以保证
: 【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: : 均値和前面的数据一样都是0 ~ 255整型


──── iWater (Mon Apr 25 13:06:57 2005) ─────────────

当然求出来的均值是会有小数的,
只是对最后的数据要求是0 ~ 255范围内的整数。

【 在 lingll ([0,-8)) 的大作中提到: 】
: 不明白,均值怎会一定是整型呢?
: 如 (1+2)/2=1.5,已经不是整型了
: 【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: : 均値和前面的数据一样都是0 ~ 255整型


──── lingll (Mon Apr 25 14:02:34 2005) ─────────────

哦,既如此,那么,几次运算损失的精度不会影响到最后结果的
所以没必要要求不损失精度
【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: 当然求出来的均值是会有小数的,
: 只是对最后的数据要求是0 ~ 255范围内的整数。
: 【 在 lingll ([0,-8)) 的大作中提到: 】
: : 不明白,均值怎会一定是整型呢?
: : 如 (1+2)/2=1.5,已经不是整型了


──── iWater (Mon Apr 25 14:14:19 2005) ─────────────

噢。
你的算法,如果是用整型来算,
我感觉会损失比较多啊,不过只是感觉而已,没求证过。

【 在 lingll ([0,-8)) 的大作中提到: 】
: 哦,既如此,那么,几次运算损失的精度不会影响到最后结果的
: 所以没必要要求不损失精度
: 【 在 iWater (月牙熊·泪涌) 的大作中提到: 】
: : 当然求出来的均值是会有小数的,
: : 只是对最后的数据要求是0 ~ 255范围内的整数。


──── barcher (Sun May  1 09:36:54 2005)   ────────────

这样做的,转化数据的计算量可能更大

【 在 surcheng (风清扬) 的大作中提到: 】
: 其实觉得换一个角度好像更加方便一些
: 设置一个long counter[256]的数组,和一个long的计数器,用于记录有多少个数据
: ,都初始化为0
: 因为数据总是在0-255之间,就将相应的数值为下标数组元素加1
: 循环完毕以后,就作一个循环将所有的值求平均加起来就可以了
: 例如总共有n个数据
: 那么就是
: double total = 0.0;
: for(int i=0;i<256;i++){
:    total += 1.0*i*couter[i]/n;
: .................(以下省略)


──── surcheng (Sun May  1 11:17:37 2005) ────────────

呵呵,估计不会,首先加1的运算是比较快的,因为cpu内部本身对于这样的运算优化了
整个过程首先不过统计了一下各个值的个数。
最后用一个256次的循环计算了一下平均值而已,觉得会更快,没有试过
觉得有必要可以测试一下的
【 在 barcher (心无碍) 的大作中提到: 】
: 这样做的,转化数据的计算量可能更大
: 【 在 surcheng (风清扬) 的大作中提到: 】
: : 其实觉得换一个角度好像更加方便一些
: : 设置一个long counter[256]的数组,和一个long的计数器,用于记录有多少个数据
: : ,都初始化为0
: : 因为数据总是在0-255之间,就将相应的数值为下标数组元素加1
: : 循环完毕以后,就作一个循环将所有的值求平均加起来就可以了
: : 例如总共有n个数据
: : 那么就是
: : double total = 0.0;
: .................(以下省略)


──── Kuibyshev (Sun May  1 11:23:22 2005)   ───────────

re
这个方法不错
【 在 surcheng (风清扬) 的大作中提到: 】
: 呵呵,估计不会,首先加1的运算是比较快的,因为cpu内部本身对于这样的运算优化了
: 整个过程首先不过统计了一下各个值的个数。
: 最后用一个256次的循环计算了一下平均值而已,觉得会更快,没有试过
: 觉得有必要可以测试一下的
: 【 在 barcher (心无碍) 的大作中提到: 】
: : 这样做的,转化数据的计算量可能更大
: : .................(以下省略)



--
※ 来源:. 逸仙时空 Yat-sen Channel bbs.zsu.edu.cn. [FROM: 192.168.34.128]
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值