大数据问题处理

一、在一个文件中有 10G 个整数,乱序排列,要求找出中位数。内存限制为 2G。
解决方案:桶排序。
1、读入内存2G数据,一个整数四个字节,将这四个字节取最高的一个字节即8位(用>>位移法取出)
2、一个字节共256种可能性,开辟256个文件,根据每个数的高8位写入文件
3、重复上述算法直到所有数算完,同时记录每个文件中的数的数量。
4、第一个文件数的个数+第二个文件数的个数... 可以判断中位数在第几个桶里面
5、把这个桶整个读入内存,之后如果大小小于2G就不用写文件了,在内存中计算就可以
6、这个桶里面的数高8位都一样,用1中的方法去取第二高的字节并重复上面的算法,然后取第三高的字节重复算法,最后一个字节可以接着桶排序,也可以快排,就能得出中位数了
二、10亿个整数,找出最大的1000个。
解决方案:有重复可以用分治法+快排或者小顶堆,如果没有重复可以桶排
1、分治法+快排:将数分成内存能装的下的分数,比如100份,每分进行快排得到最大的1000个,然后将100*1000个数进行快排取1000个。这里快排方法如下:每趟快排可以将数组分成数量不一定的两部分,如果大的那份多余1000,再对着分进行一次快排,如果再多再对多的那份快排一次,如果少了则对少的这份快排一次,如此循环直到够1000个为止。
2、小顶堆:先从文件中读取1000个数到内存,建小顶堆,之后依次读取,每读一个数就和堆顶比较,小于堆顶则丢弃,大于堆顶则与堆顶交换再重建堆,直到全部读取完毕。
3、桶排序:按最高位分256个桶,最高的一个应该超过1000个数,再把这个桶拿出来按第二位继续分桶,直到够数了。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 教你如何迅速秒杀掉:99%的海量数据处理面试题 本文经过大量细致的优化后,收录于我的新书《编程之法》第六章中,新书...
    Helen_Cat阅读 7,466评论 1 39
  • 摘要:本文将向您讲述诸多数据处理面试题以及方法的总结。 第一部分、十道海量数据处理面试题 1、海量日志数据,提取出...
    拾壹北阅读 1,713评论 0 28
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,726评论 25 709
  • 第一部分、十道海量数据处理面试题 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 此题,在我之前的一篇文...
    零一间阅读 961评论 0 5
  • 你扛不住的小情绪 愿你能安然无恙发泄掉 迷茫、害怕、犯了错 愿你有个温暖的角落 当你为梦想义无反顾 愿有人感动 也...
    江上雨寒舟里阅读 325评论 0 1