1.给定一个大小超过100G的文件,其中存在IP地址,找出其中出现次数最多的IP地址。
思路:显然我们是不可能将这100G内存直接加载到内存中去处理的。所以我们可以对大文件进行划分,前提当然是相同的IP地址会被划分在一块。假定我们将这个文件分为1024份,那么一个文件的大小大概为100M,然后利用哈希算法对IP地址进行映射,得到的值%1024,将同一个IP地址映射到同一个文件中。然后对每个文件进行处理,以他们的hash(IP) 作为Key,value作为每个IP出现的次数,最后利用排序算法对value进行排序,找到每个小文件中出现次数最多的IP。
用这种方法解决这个问题的关键在于我们在用哈希函数进行哈希切分后相同的IP地址一定会被分到同一个小文件里。对于哈希切分,相同的key,得到的哈希值一定相同。
2.给定100亿个整数,找到其中只出现一次的整数。
思路:我们知道,整数总共有大概42亿,所以100亿里肯定有重复的数字,我们可以试着用位图解决这个问题,但是位图只能表示一个数是否存在,所以我们需要两个位来表示一个数。我们可以用00来表示不存在,用01表示存在一次,用10表示存在一个以上。(定义两个BitMap)。1G=2^30B,1B=8bit。所以1G大概可以表示40多亿数,可以解决这个问题。
基本思路:对文件A进行哈希切分,读取每一个query,计算哈希值,例如我们要切分成100份,就可以让hash值%100,如果模的值为0,就把这个query放到布隆过滤器中,这样我们就得到了0号集合;然后遍历文件B,对其中的query进行hash值,%100,如果模的值为0,就在布隆过滤器中查找。
4. 给上千个文件, 每个文件大小为1K - 100M, 设计算法找到某个词存在在哪些文件中(倒排索引).
基本思路:正排:通过文件id,找到包含哪些词。
倒排:通过词,找到id.