转自:http://www.cnblogs.com/kanong/archive/2010/10/06/1844490.html
最近几天都在研究一些面试,笔试题,发现有一种题型很经常出现,如从十亿个整数中选择前100大整数,或者是这类题的变形: |
很多人看到这种题的第一反应是排序,如果你是这样回答的话,offer肯定是没有了。原因如下: |
1. 存放10亿个数据的内存得多大呀, 所以内部排序是不可能了! |
2. 就算采用外部排序的方法,可以解决内存不足的问题,但外部排序读取内存非常频繁,将大大影响速度,我怀疑计算机在报废之前,拍完序的可能性! |
好了,说说我的方案吧!是我目前能想到的最好的方法,如果谁有更好的,欢迎分享呀! |
1. 用10亿个数据的前100个整数建立小顶堆。 |
2. 向堆中插入数据,如果比堆顶小的话,直接抛弃。否则替换堆顶,进行堆调整。 |
3. 当上面的操作完成后,堆里面的数据就是前100大的整数了。 |
上面的方法,读取文件的次数为10亿次(这是不可避免的),使用的内存为100个整数空间,最坏情况下的时间复杂度为(10亿* log (100)). |
代码如下:<BR> |