海量数据处理问题
1.给定一个大小超过 100G 的文件, 其中存在 IP 地址, 找到其中出现次数最多的 IP 地址(hash文件切分)
思路:显然我们是不可能将这100G内存直接加载到内存中取处理的。所以我们可以对大文件进行划分,前提当然是相同IP地址会被划分在一块。假定我们将这个文件分为1024份,那么一个文件的大小大概为100M,然后利用哈希算法对IP地址进行映射,得到的值%1024,将同一个IP地址映射到同一个文件中,然后对每个文件进行处理,以他们的Hash(IP)作为Key,value作为每个IP出现的次数,最后利用排序算法对value进行排序,找到每个文件中出现次数最多的IP。
用这种方法解决这个问题的关键在于我们在用哈希函数进行哈希切分后相同的IP地址一定会被分到同一个小文件里。对于哈希切分,相同的key,得到的哈希值一定相同。
2.给定100亿个整数, 找到其中只出现一次的整数(位图变形, 用两位来表示次数).
方法如下图:
3.有两个文件, 分别有100亿个query(查询词, 字符串), 只有1G内存, 找到两个文件的交集(hash文件切分 + 布隆过滤器).
思路:对文件A进行哈希切分,读取每一个query,计算哈希值,假如我们要切分成100份,就可以让Hash值%100,如果模的值为0,就把这个query放到布隆过滤器中,这样我们就得到了0号集合;然后遍历文件B,对其中的query进行算hash值%100,如果模的值为0,就在布隆过滤器中查找。
依次处理1号集合(hash值%100 == 1),2号集合,3号集合………..
4.给上千个文件, 每个文件大小为1K - 100M, 设计算法找到某个词存在在哪些文件中(倒排索引)
思路:正排 -> 根据文件ID,找到包含哪些词;
倒排 -> 根据词,找到文件ID