数据很多,比如有几千万个,要求均值,
全部数据都是整数,范围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]