位图、布隆过滤器及其相关面试题

位图:

为了处理大量数据的问题,位图的出现极大的节省了我们进行大数据计算是的时间复杂度以及节省了大量的空间,位图主要利用的是位,使用8位二进制表示8个数字,相当于一个字节就可以表示8个数字,极大的节省了空间,而且在查找的时候的复杂度可以达到O(1)

布隆过滤器:

我们在给客户推送视频的时候,我们只会推荐客户没有看过的视频,那么我们如何来确定那个视频用户看过了,那个用户没有看过,在这里我们如果使用哈希桶的话,会产生比较大的空间浪费,如果使用位图的话,就不能处理哈希冲突,所以我们这里结合了哈希桶与位图,既节省了空间也可以处理冲突,就叫做布隆过滤器。

布隆过滤器的工作原理是:将每一个视频分成好几份,放到一个位图中,然后每次新来一个视频也分成这几份,然后取位图中看对应的位置上面是不是空,如果这几个对应都不是空的话,那么这个视频用户就有可能看过,只要有一个位置是空的,就可以说这个视频这个用户就没有看过。注意:这里布隆过滤器并不能判断一个视频一定看过,只能判断可能看过或者没有看过。并且布隆过滤器一般不能删除,因为如果删除的话,就有可能会影响其他的元素的判断。

海量面试题:

1、哈希切割
给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址? 与上题条件相同,
如何找到top K的IP?如何直接用Linux系统命令实现?
1.使用哈希桶,将100G的内存分为65536个65536大小的内存,在每个65536大小的桶中,找到出现次数最多的,然后将65536个桶继续找到他们中的最多的,就得到了总体最多的。
2.和上述方法差不多,不同的一点是在上面每个桶里面的最多的拿出来比较,在最小的那个桶里面找到他的第K个(使用堆),然后在其他桶里将大于这个数的都找到,进行排序,取前K个即可。
3.sort | uniq -c | sort -nr | head -10

2、位图应用
给定100亿个整数,设计算法找到只出现一次的整数?
找到两个位图,出现第一次,第一个位图置1,第二次第二个位图置1,最后遍历结束找到第一个位图是1,第二个位图是0的数字即可
给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?
同样两个位图,出现一次第一个置1,出现第二次第二个置1,遍历结束,找到两个位图对应位置都是1 的数字即可。
位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数
两个位图,一次都不出现就是0 0,出现一次就1 0,出现两个就是 1 1,出现更多次就是0 1,遍历结束之后判断一下两个位图即可
3、布隆过滤器
给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和
近似算法
精确算法:使用位图,两个位图,出现一次第一个置1,出现第二次第二个置1,遍历结束,找到两个位图对应位置都是1 的数字即可
近似算法:使用布隆过滤器,由于布隆过滤器只能判断那些可能存在或者一定不存在的,所以就是近似算法,首先遍历一遍将每个query放进去,然后再一次遍历就能判断出可能出现的那些query,就可能是交集
如何扩展BloomFilter使得它支持删除元素的操作
计数删除可以,但是计数删除当出现的额次数太大就有可能造成计数回绕的情况。所以说一般布隆过滤器不支持删除。
4、倒排索引
给上千个文件,每个文件大小为1K—100M。给n个词,设计算法对每个词找到所有包含它的文件,你只有
100K内存
将100M文件切成1024次,然后直接遍历一遍,将每个文件出现的情况做成一个表就可以了,就成了一个倒排索引,然后找到需要查找的单词,然后将后面的文件名全部输出就行了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值