代码改变世界

10亿个整数中找出前10万个数

2010-12-01 15:50 by Sun Yongyue, ... 阅读, ... 评论, 收藏, 编辑

-)

先考虑另一个问题:2000个乱序的32位整数中取出前10个。直接修改后的快排上。

 

二)

现在的问题是10亿个,假设32位int,单个数字占用4个byte,10亿个数字就大概是4G的空间。目前普通的个人电脑达不到这个要求,无法做到一次load进内存进行修改后的快排。为了更明显点,不妨放大到1000亿数据取前10万个,明显大多数的服务器也做不了一次load内存-___-。

 

如果我有这个问题,我会问:单台机?多台机(或已经有map-reduce方式的计算集群)?

1) 单台机,

最小堆(或最大堆,看要求)。乖,不用争,排好队,一个一个来。

忘了写上复杂度,如果总个数是N(比如说10亿),要的个数是M(比如说10万),那复杂度是N*log(M)。比快排弱一点,但是这个场景还好。

 

2) 多台机map-reduce

先分成N份(比如10份、100份),各自先找出前10万个,再从结果的N*10万个里找出前10万个。

 

三)

还没完,如果数据量是前边所说的1000亿,甚至10000亿个呢?

看看,32位的整数撑死也就2^32=4G个,小于40亿,那10000亿个数是不是可以考虑Hash呢?

 

大概想法,大概想法,想太多了,异想天开。