免费注册 查看新帖 |

Chinaunix

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

如何在上亿条记录中查找第排在第100万位的数? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-12-18 11:44 |只看该作者 |倒序浏览
考虑这样一个问题:
          假设有一个海量的log记录库,例如,有上亿条记录,并且它是完全无序的。为了简化问题,我们再假设每条log的数据结构仅仅是一个浮点数,并且整个log库中无重复的记录。现在我们想寻找大小排在第100万个位置的数(假设顺序是从小到大),大家有什么好算法,能提供怎么样的优化呢?

谢谢大家!

论坛徽章:
0
2 [报告]
发表于 2006-12-18 12:30 |只看该作者
如果原文件是无序的话,选择排序查找?
这么大的数据应该维护成有序的,如果需要经常查找的话,再说这应该是数据库的事了

[ 本帖最后由 tyc611 于 2006-12-18 12:33 编辑 ]

论坛徽章:
0
3 [报告]
发表于 2006-12-18 12:57 |只看该作者
nth_element?????????
记录太多

论坛徽章:
0
4 [报告]
发表于 2006-12-18 13:19 |只看该作者

可以采用快速排序算法的方法

假设知道最大值和最小值范围。
首先取center = (max + min) / 2
然后 > center的放入一边, < center 的放入一边。
统计两边的个数,然后修改max和min,重新做。

像你说的,如果固定的100万,可以把center 设置为靠近100万的值。

论坛徽章:
0
5 [报告]
发表于 2006-12-18 13:19 |只看该作者
先排序,再定位

论坛徽章:
0
6 [报告]
发表于 2006-12-18 13:47 |只看该作者
在n个数中找出第k大的数,这是个经典问题,应该采用快速选择排序,其实是借鉴快速排序的思想。
你可以到网上去搜索解答方案。

论坛徽章:
0
7 [报告]
发表于 2006-12-18 15:30 |只看该作者
nth_element,stl里面自带的算法,我的博客里面也有这样的算法,记得没有错的是借助堆排序算法写的.

论坛徽章:
0
8 [报告]
发表于 2006-12-18 15:35 |只看该作者

论坛徽章:
0
9 [报告]
发表于 2006-12-18 16:05 |只看该作者
原帖由 susesuse 于 2006-12-17 21:47 发表
在n个数中找出第k大的数,这是个经典问题,应该采用快速选择排序,其实是借鉴快速排序的思想。
你可以到网上去搜索解答方案。


这个要求数据都放入内存的。上亿条记录,400来兆内存,应该可以吧。。
我觉得还是不能假设数据一下子读入内存再处理,比如可以在内存里维持一个k个数组成的堆,每次读入一个新的数据x,就和堆里的最小数y比较,如果x>y则把y去掉,x入堆。最后扫完所有数据后,堆里的最小数就是需要的第k大的元素。复杂度 n log (k)。

论坛徽章:
0
10 [报告]
发表于 2006-12-18 16:10 |只看该作者
这个问题的关键在于数据库如何保存这上亿条记录,如果采用适当的结构,比如B+树或AVL树,那么查找第100万个数log(n)就能找到了。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP