海量面试题的条件一般都要求我们处理一批计算机内存放不下的数据。当我们遇到这种面试题时,常有以下几种思想:
1. 哈希切分
哈希切分就是将一个大文件,利用哈希的原理,将其分为若干个小文件。相同的数据都被分到同一个文件里。例如我有一个存放着100亿个整数的大文件,将其分为100个小文件。将每个数都模100,结果相同的数存放到一个文件里。如果这100亿个数理想均匀,则每个小文件大约为1亿个数。
2. 位图(BitMap)
3. 布隆过滤器(Bloom Fileter)
4. 哈希表
5. 堆
例题1:给一个100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?
这道题没有给出我们能运用的内存是多大,所以应该先和面试官沟通清楚,问清楚可以用的内存有多少。假如为1GB。
解法:利用哈希切分,将这100G的大文件切分成1000个约为100M的小文件(倘若内存还不够,可再分)。上面我们已经说过,相同的数据已经被分到了相同的文件里。再分别按顺序将这1000个小文件引入内存, 利用哈希表或者其他方法,求出每个小文件中出现最多的IP地址。这样我们就得到1000个IP。再这1000个IP里面选出出现次数最多的。
例题2:与上题条件相同,如何找到top K的IP?
当我们遇到求TopK的题时,一般考虑用堆。求最多或最大,用大堆。求最小或最少,用小堆。这里假设求出现次数最多的前K个IP。
1. 同样利用