海量数据处理(面试题)

1.给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?!
解题思路:哈希分桶法。
1,将100G文件分到1000个文件中,然后将每个IP地址映射到对应文件(IP地址转换为整数,对文件个数进行取余,然后根据结果放入对应文件,这样保证相同的IP肯定在同一文件中);
2,统计每个文件中出现次数最多的IP,然后比较取最大值。

2.与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现?!
解题思路:哈希分桶法。
与上面思路一样,只不过取每个文件中出现最多的K个IP,然后比较取top K 的IP。

//k = 10;
Linux指令:sort log_file | uniq -c | sort -nr | head -10
//sort1:将IP进行排序,使得相同的IP相邻;
//uniq -c: 在输出行前面加上每行在输入文件的出现次数
//sort2:-n:根据数据大小排序,-r:逆序
//head -10:显示文件的前10行。

3.给定100亿个整数,设计算法找到只出现一次的整数!
解题思路:1,哈希分桶法;2,位图(只针对整数)
1G –>10亿字节,42亿整数–>160亿字节–>16G–>500MB
1,将100亿整数分为100份文件,将每个整数映射进对应文件,取每个文件中只出现了一次的整数,最后汇总。
2,使用位图,一个位一般表示存在or不存在,这里需要找出现一次的整数,所以使用两个位,表示状态(00:不存在,01:存在一次,10:存在多次)。而整数范围是42亿多,所以需开1G大的位图即可。

4.给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集!
解题思路:哈希分桶法、位图
分别将100亿个数据分为1000份,取余放入相应文件,然后只需判断对比编号相同的两个文件

5.100亿个整数,内存足够找到中位数,内存不足找到中位数
内存足够时:类似快排的思想,随机找一个数,将小于它的数放置他的左边,大于它的数放置它的右边,然后重新找区间递归,直至找到中位数;
内存不足时:使用哈希分桶法

6.给两个文件,分别有100亿个url,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和近似算法!
精确算法:哈希分桶法;
近似算法:布隆过滤器。将100亿个url转换为整数,将整数放进集合时,使用K个哈希函数将这个整数映射到一个位矩阵中的K个点,将这些点置为1。检索时,只需看这些点是否为1即可,但是这里存在误差,因为某个点可能是别的整数映射的,导致有的数检测是存在的,实则是不存在的。但是检测到数据不存在则肯定是不存在的。
7.如何扩展BloomFilter使得它支持删除元素的操作?如何扩展BloomFilter使得它支持计数操作?!
因为可能存在多个数映射的点是重复的,所以布隆过滤器是不支持删除的,所以我们可以引入引用计数机制,使用一个size_t来表示(如果还是不够就先切分),如果删除一个数就引用计数减一即可。

8.给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它文件,你只有100K内存!
解题思路:布隆过滤器;
1,建立一个文件info,用来存储这n个词及他被包含的文件信息;建立一个文件bloom在外存,保存生成的布隆过滤器信息。
2,n个数分成x组,每一组生成一个布隆过滤器;
3,然后遍历这些文件,大的进行切分,然后映射进布隆过滤器;
4,然后读入单词,如果布隆过滤器中存在,则更新info文件,继续遍历新的布隆过滤器直至遍历完。
9.有一个词典,包含N个英文单词,现在任意给一个字符串,设计算法找出包含这个字符串的所有英文单词!
解题思路:1,暴力求解;2,字典树
1,使用 strstr()进行字符串匹配;
2,字典树;
3,倒排索引;
给输入字符串,利⽤用字母建立倒排索引,索引中存储该字母 出现在哪个单词以及在单词中位置;查询时,利用倒排找到所有的单词,并求交集并且位置要连续

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值