免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12
最近访问板块 发新帖
楼主: xunen
打印 上一主题 下一主题

[算法] 求大数平均数 [复制链接]

论坛徽章:
3
2015年迎新春徽章
日期:2015-03-04 09:56:11数据库技术版块每日发帖之星
日期:2016-08-03 06:20:00数据库技术版块每日发帖之星
日期:2016-08-04 06:20:00
11 [报告]
发表于 2010-11-23 10:31 |只看该作者
如果是不支持 uint64_t 类型的机器呢?
xunen 发表于 2010-11-23 10:30



    如果没有这样的整形直接在C语言里支持,那么就去模拟一个,不难

论坛徽章:
0
12 [报告]
发表于 2010-11-23 10:37 |只看该作者
求的平均数也是整数吧,如果是浮点数有浮点数算法库

论坛徽章:
0
13 [报告]
发表于 2010-11-23 10:39 |只看该作者
哦,谢谢。那基本上 这题可以这样解答了:

使用uint64_t表示和数,可以避免溢出。如果机器不支持 uint64_t 类型,可以去模拟一个。

如果 数很大,精度要求不是很高,可以每次求两个数的平均值(注意溢出问题),到最后就是所有的平均值。

论坛徽章:
1
2015年迎新春徽章
日期:2015-03-04 09:56:11
14 [报告]
发表于 2010-11-23 15:19 |只看该作者
本帖最后由 zongyaotang 于 2010-12-05 15:24 编辑

回复 3# bladmin

本算法要预先知道数据的个数。
逐个取数,
到刚大于数据个数时就除出商来
累加商,余数继续和取数相加,
重复该过程
累加商就是结果,最后的余数即结果的余数


#!/bin/bash
# 求 sam 文件中值的平均

BL="1 3 7 4 6 23 45 67"

echo $BL | tr ' ' '\n' > sam
CX=`wc -l sam | awk '{print $1}'`
awk -v CNT=$CX 'BEGIN { res=0; acc=0}
{       res += $1
        if(res >= CNT)
        {       m = res % CNT
                acc += ((res - m) / CNT)
                res = m
        }
}END{ printf("有 %d 个数        均值=%d 余数=%d\n", CNT, acc, res)}' < sam
exit

论坛徽章:
0
15 [报告]
发表于 2010-12-05 11:18 |只看该作者
在线等算法达人出现
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP