海量数据处理

海量数据处理

谁说胖子不能爱 提交于 2019-11-25 20:15:32
有20亿个数,给定内存大小为1G,求中位数 首先求中位数,其实就是求topK,比如此题就是求top 20G/2( 1亿个int占用512M内存,10亿个字节占1G内存,要记住 )。 如果内存能存下这么多数,直接用一个大小为20G/2的堆就可以。另外求topK时,有个窍门:求最大topK,先建一个最小堆,然后所有大于根节点的值,替换根节点并调平衡;求最小topK,先建一个最大堆,然后将比根节点小的值插入堆。 此题内存存不下这么多数,可以这么做: 先建一个最大堆,大小为1G(内存大小),先求出第1G大的数(即堆的根节点),然后再以此值作为堆的根节点建堆,求出第2G大的数,依次类推,直到求出第5G大的数即为所求。每次建堆并求最大值的时间复杂度为nlogk,一共需要建5次堆。 处理海量数据思路 1.分而治之/hash映射 + hashmap/trie统计 + 堆排序 + 归并 2.bitmap/bloom filter 3.多层划分 例题 1.海量日志数据,提取出某日访问百度次数最多的那个IP 2.寻找热门查询,300万个查询字符串中统计最热门的10个查询 3.有一个1G大小的一个文件,里面每一行是一个词,词的大小不超过16字节,内存限制大小是1M。返回频数最高的100个词 4. 海量数据分布在100台电脑中,想个办法高效统计出这批数据的TOP10 5.给定a、b两个文件