1、给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址。

思路分析:
1.使用字符串哈希算法将相同IP 分配到一个文件中。将这些IP分配到1000个文件中。
2.由于字符串哈希算法会出现误差。所以再统计每个人文件中的top3 IP(使用Key_Value模型)。
3.将每个文件中的top3合并,再找出出现次数最多的IP即可。

2、给定100亿个整数,设计算法找到只出现一次的整数 。

思路分析:
这里使用BittMap(位图),每两个BIT位标记一个整数。没出现标记位为:00,出现一次为:01,出现超过一次均标记为:11。最终遍历这些标记为找出标记为01的整数,即是出现一次的整数。

3、给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集 。

思路分析:
1.先采用哈希切分,分别将这100亿个整数分配到400个文件中。文件名标记为A1,B1;A2,B2……A399,B399,若两者有交集则交集必出现在Ai和Bi中。
2.将文件A1的整型用扩展位图标记(重复出现则只标记一次即:01)。再将B1用该扩展位图标记为:10。
3.分别求出这400个文件的交集,再合并就是这两个文件的交集。

4、1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

思路分析:
使用位图,两个bit标记一个整数。00:未出现,01,出现一次,10出现两次,11出现两次以上。遍历位图找出标记为10的数即是出现不超过两次的整数。

5、给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和

思路分析:
(1)近似算法:直接使用BoolFilter将其中个文件中对应的query进行标记,再用另一个文件中的query进行查询。若标记为1,则表明所查询的query为交集,查询完所有query即可找到两个文件的交集。此方法之所以不精确是因为不同的 query计算出的哈希值相同在标记时候就会误标记,最终导致误判。

(2)精确算法:利用哈希算法将两个文件内分别容映射到1000个哈希桶中。哈希桶记为A1,A2,A3……,B1,B2,B3……。若query为交集,则必分别存在于A1和B1中,依次类推。再分别求出(A1,B1),(B1,B2)……的交集,最后合并这些query,就能算出这两个文件的交集。

6、如何扩展BloomFilter使得它支持删除元素的操作 ?如何扩展BloomFilter使得它支持计数操作 ?

思路分析:
扩展BloomFilter不再使用一个BIT为去标记,而是使用一个整型即4个字节。初始化时将每个整型置零。当有元素插入时哈希值所对应的整型自增运算。在删除时只用将哈希值所对应的整型自减运算。当一个元素对应的其中一个整型标记为0时,即表示这个元素已经删除。
用这种结构同样支持计数,在查询时分别检测某元素对应的所有标记位,最小值即为该元素出现的次数。

7、给上千个文件,每个文件大小为1K—100M。给n个设计算法对每个词找到所有包含它的文件,你只有100K内存

思路分析:
先对文件进行词法分析找出每个文件中的关键词。之后利用字符串哈希算法将关键词存入哈希表里,同时将每个关键词对应的文件名链在关键词之后。
在搜索时,输入对应的关键词用同样的哈希算法即可找到关键词对应的文件。

如图假设现在有4个文件,将文件中的关键词存入到哈希表中,再输入关键词即可找到对应的文件。

海量数据处理思路

相关文章: