本文主要整理一些常见的海量数据处理面试题。
1. 海量id,找出出现次数最多的id
情况1:
直接hash table统计,hash table包含N个(id, count)对,遍历求最值。
情况2:
内存受限,海量id通过hash函数(id看做整数,hash函数取%1000)映射到1000个文件。每个文件使用hash table统计,产生1000个最值,遍历这1000个数求最值。
2. 海量id,找出出现次数最多的k个id
情况1:
直接hash table统计,使用小根堆求top k。复杂度为O(n) + O(nlogk)。
情况2:
内存受限,海量id通过hash函数映射到1000个文件。每个文件使用hash table统计 + 小根堆产生一个top k,共1000个top k,归并排序1000个top k,产生最终的top k。
3. bitmap (2^32 约等于43亿)
Q1:在2.5亿个整数中找出不重复的整数
采用2-bitmap(每个数分配2bit,00表示不存在,01表示出现一次,10表示出现多次,11无意义)。遍历这2.5亿个整数,查看bitmap中相对应位,如果是00变01,01变10,10保持不变。遍历结束,查看bitmap,对应位是01的整数就是不重复的。
Q2:给40亿个不重复的unsigned int的整数,没排过序的,然后再给一个数,如何快速判断这个数是否在那40亿个数当中?
使用bitmap。读入40亿个数,设置相应的bit位,读入要查询的数,查看相应的bit是否为1。为1表示存在,为0表示不存在。
4. 1000亿个数,无序,找出它们的中位数
第一次扫描把这些数划分到多个区域,统计每个区域的整数个数,找到中位数所在区域。第二次扫描该区域,统计每个数出现的次数,找到中位数。(如果数据量不大,可以使用快排的partition,或者直接map统计不同数出现的次数)
reference: