面试题之--大数据

1:给一个超过100G大小的long file,long中存着IP地址,设计算法找到次数最多的IP地址:
现实问题:
(1)我们知道计算机的内存在4G,可以存放大约16G的字节的内容,因此要想把100G的大文件存到计算机中,基本不可能
(2)我们可以使用前面讲的位图,一个整形32位,最多可以存42亿多的数据,100G的大文件,最多需要3.2G就可以放进去,但是却难以统计最多的IP地址
这时候我们会想到把大文件放到小文件中,再来统计就会很容易
如何切分:算法思想是哈希切分
(1)哈希函数hash(IP)%1000个文件,这样大文件就可以分成1000个小文件,
sass(2)哈希算法采用闭散列方法,避免将出现IP最多的数据分配到不同的文件中,
(3)字符串哈希函数将字符串转换为整数,统计次数可以用Hashmap底层是HashTable,效率接近于O(1);
2:和上面的条件相同,如何统计TopK(IP)??
这个一个典型的TopK问题;根据上面的条件先将IP地址分成1000个左右的小文件,出现IP相同的在同一个文件中,统计每个小文件的Topk文件的次数?
( 1 ):堆排序时间复杂度是O(N*logN)
(2):优先级队列:时间复杂度O(N*logN)
(3):map和set时间复杂度O(logN);
(4):HashTable的时间复杂度O(1);
3:给定100亿个整数,设计算法找到只出现一次的整数;
(1):内存足够的情况,常规的算法的算法将这个100亿个整数放到内存中然后用二分法查找
(2):内存限制

“`
,位图,一个整形32位可以存42亿多字节大于500M,100亿整数只需要1.25G的内存就可以,
这时候会有三种状态:
a:不存在
b:存在一次
c:存在多次
用位图的扩展,2个位表示一种状态,00表示不存在,01表示存在1次,10和11表示出现多次
4:给定两个文件,分别有100亿个整数,我们只有1G的内存,如何找到两个文件的交集?
如果按照位图存储100亿个整数需要1.25G的内存,还是不能放进去;
进行切分平均分成小文件,将小文件拿道内存中比对,看是否存在,求交集。
1:将A.B两个大文件分别切分成1000个左右的小文件(哈希切分)
2:分别拿A里面的小文件和B里面的文件比对,有相同的就是交集

这里写图片描述
5:1个文件有100亿个int,1G的内存如何找到出现次数不超过2次的整数
按照前面我们学的位图,一个整形32位大约可以存储40多亿整数,100亿个整数大约需要1.25G的内存,可是此时的内存只有1G如何存储呢?
我们可以用两个位来表示这样512M左右的内存就可以存下了,同时我们可以来设置位来表示相应的数字,我们知道两个位可以表示4个数字,这里我们用01表示数字出现1次,10表示数字出现2次,11表示数字超过两次.这样就可以快速找到出现次数不超过2次的数字;
6:给定两个文件,分别有100亿个query,我们只有1G的内存,如何找到两个文件的交集,给出精确算法和估计算法:
我们知道查找算法常见是的布隆,由于查找,但是布隆有个缺点是数据过多时,会出现误判,
估计算法步骤:
1:通过字符串哈希算法,将字符串转换成数字
2:通过除留余数法将这些数字映射到集合中(bit_set)中
3:判断映射的位置是否都存在,存在表明有交集.
精确算法:
同样这时100G的大文件,和前面查找交集一样,我们把这两个大文件A,B分别按照hash切分,分成1000分的小文件,这样就可以放到内存中,然后我们拿A中的小文件分别和B中的比对,这样就可以找到两个文件的交集
7:如何扩展BloomFile使它支持删除,
在布隆过滤器中已经介绍,加上引用计数就可以了支持删除了.
http://blog.csdn.net/f2016913/article/details/70598583
8:如何扩展BloomFile使它支持计数:
在位图中我们也理解,用位就可以表示数字的状态,这样就可以计数
9:给上千个文件,每个文件的大小都在在1K~100M,给n个词,设计算法找到每个包含它的文件,只有100k的内存:
我们可以用每个文件建一个布隆,这样就可以找到每个文件出现的单词,最后依次遍历这些文件,就可以找到n个单词所在的文件.
10:有⼀一个词典,包含N个英⽂单词,现在任意给⼀一个字符串,设计算法找出包含这个字符串的所
有英⽂单词?
这个方法比如可以通过一个简单的字典树,set的key值和value值相同,根据key来遍历这个字典树,然后继续遍历直到找这个字符串所有的英文单词.
总结:
通过这几个大数据的的存储问题:
1:快速查找一个单词或者是一个数字存不存在,当查找的数字十分庞大,内存放不下我们可以考虑用位图:
2:判断一个单词或者一个数字在不在一个集合中我们可以通过布隆,映射到相同的位置,表明存在,但是可能会存在误判;
3:大文件找交集,内存放不下,我们可以借助哈希切分分成小文件,然后在一个个比对.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值