1.给一个超过100G大小的log file, log中存着IP地址,设计算法找到出现次数最多的IP地址?
思路:首先,对于一个超过100G大小的Log File,现在来说肯定是进入不了内存的,要想找出在这个文件中出现次数最多的IP,必须对于这个文件进行切分;
(1)先将这超过100G大小的Log File 切分成 100个文件;
(2)使用字符串哈希算法,对于文件中的字符串进行计算,让相同的IP进入同一个的 文件;
(3)分别找到这100个文件中,出现次数最多的IP;
(4)对于这100个IP,进行查找,就很容易的找出:出现次数最多的IP;
2.与上题条件相同,如何找到top K的IP?
思路:与上题一样,对于处理超过100G大小的文件,还是先要进行切分;
(1)(2)同上;
(3)分别找出这100个文件中的top K的IP;
(4)将找到的所有IP建立一个小堆,从而就可以找出top K的IP;
3.给定100亿个整数,设计算法找到只出现一次的整数.
思路:首先对于100亿个整数,大概就是37.25GB,全部加载到内存处理,现在看来还不行,因此我们可以进行切分:将100亿个整数,切分为100份,每份大约为381.5MB;
(1)对于每份文件用哈希表存储,找到每份中只出现一次的整数;
(2)对于100份文件中所有出现一次的数字合并在一块,就可以得到100亿个整数中只 出现一次的所有整数;
4.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集.
思路:和上题一样,100亿个整数,而我们只有1G的内存,所以全部加载到内存是非常不现实的;因此,我们还是要将这两个文件分别进行切分的;
(1)将第一个文件切分100份,根据合适的散列函数让相等的数都进入同一个文件中,并且对于文件进行编号;
(2)将第二个文件切分100份,用和切分文件一相同的散列函数进行切分让相等的数都进入同一个文件,并且对于这100份文件进行编号;
(3)通过(1)(2)的处理,那么文件相同的部分必然出现在编号相同的文件中;
(4)同时将两个文件中编号相同的文件加载到内存中,将两个文件进行对比,可以分别找出这100对文件中相同的;
(5)对于100对中找出来相同的部分进行合并,即可找到:这两个文件中的交集;
5.1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数.
思路:对于这100亿个数,总共有3种状态:(1)这个数出现了一次;(2)这个数出现了二次;(3)这个数出现了多次;由于这些数据为整数,可以用位图进行存储数据这些状态,然后进行查找,找出出现次数不超过2次的所有整数;
(1)建两个文件,设置一个值key,大于这个key的数进入第一个文件;小于key值的数进入第二个文件(设置的key尽量使得这两个文件中数的数目是差不多的);
(2)将第一个文件中的所有数的状态存到一个位图中(一个数据有三种状态,所以一个数字用两个bit位来存放,而且(1)的分割选择一个是两个文件大小差不多的key,所以第一个文件以位图存储大约需要9540多MB的内存),然后通过查找,找出文件一中出现次数不超过两次的所有整数;
(3)对于文件二,使用和文件一相同的方法;
(4)将两个文件所找到的所有整数合并,便可以找到这100亿个int 中出现次数不超过两个的整数。