免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 10714 | 回复: 10
打印 上一主题 下一主题

[算法] 海量数据找中位数 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-09-21 14:57 |只看该作者 |倒序浏览
在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。只写出思路即可。

下面说说我的思路,欢迎拍转:
假设每个整数用一个bit表示,10G个整数就需要10G个bit=10G/8=1.25G个字节 < 2G的内存限制.
所以在内存中定义一个1.25G的大数组,定义一个整数n = 0;
然后从文件中读入整数,每读入一个整数就把大数组中相应bit位置为1,同时n+1(如果相应bit已经置为1了,n就不用加1)
这样所有的整数读完以后,n就是大数组中bit为1的个数,也就是10G数字中去重的数字个数.
然后遍历大数组,第n/2个bit为1的数就是要求的中位数.

欢迎多给点建议,谢谢!


ps:如何有效给大数组的某个bit位置1???

[ 本帖最后由 xiaozhu2007 于 2008-9-22 13:17 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-09-21 19:57 |只看该作者
没有说整数范围是0到10*2^30吧..

论坛徽章:
0
3 [报告]
发表于 2008-09-21 19:59 |只看该作者
中位数是什么意思

2,2,100的中位数是 (2+2+100)/3还是  (2+100)/2 ?

论坛徽章:
0
4 [报告]
发表于 2008-09-21 20:11 |只看该作者
原帖由 wilbur512 于 2008-9-21 19:59 发表
中位数是什么意思

2,2,100的中位数是 (2+2+100)/3还是  (2+100)/2 ?

这个问题不是关键,不重要.

论坛徽章:
0
5 [报告]
发表于 2008-09-21 20:31 |只看该作者
原帖由 wilbur512 于 2008-9-21 19:57 发表
没有说整数范围是0到10*2^30吧..

???没明白你的意思.
我没有考虑整数是负数的情况.

论坛徽章:
0
6 [报告]
发表于 2008-09-21 20:54 |只看该作者
unsigned int 的范围是 0-4G
4G个bit就可以了吧

论坛徽章:
0
7 [报告]
发表于 2008-09-21 21:06 |只看该作者
如何有效给大数组的某个bit位置1


char*  array =  (char*)malloc(512*1024*1024);

数字为m的话

*(array+m/8-1) | = 0x1<<(m%;

乱写的 .

论坛徽章:
0
8 [报告]
发表于 2008-09-21 21:33 |只看该作者
原帖由 wilbur512 于 2008-9-21 19:59 发表
中位数是什么意思

2,2,100的中位数是 (2+2+100)/3还是  (2+100)/2 ?

排序后中间的那个数。。

论坛徽章:
0
9 [报告]
发表于 2008-09-21 22:58 |只看该作者
原帖由 wilbur512 于 2008-9-21 20:54 发表
unsigned int 的范围是 0-4G
4G个bit就可以了吧

对对对,不用10G个bit,我没想清楚!

论坛徽章:
0
10 [报告]
发表于 2008-09-22 11:19 |只看该作者
原帖由 wilbur512 于 2008-9-21 21:06 发表
如何有效给大数组的某个bit位置1


char*  array =  (char*)malloc(512*1024*1024);

数字为m的话

*(array+m/8-1) | = 0x1



这样不对吧...
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP