位图&&布隆过滤器

经典题【给40亿个无符号的且无序的不重复的整数,如何判断一个数是否存在于这40亿个整数之中。】
分析:40亿整数:也就是40*4 = 160亿字节,也就是需要16G的内存才可以将这40亿的整数存储。显然当代我们的计算机并不能达到这样的要求,为了解决这样的问题,我们就要想其它的方法。我们的目的是为了判断一个数是否存在,所以,我们就可以将问题简化,只需要1位表示0和1就可以判断一个数是否真正的存在。所以,40亿的数据如果我们用40亿位来表示,那么也是可以的,那么这样就大约需要500M的内存,如此,就可以完美的解决这个问题了。
上面的解题方法,就是采用位图的方法。


位图

位图:其实是哈希的一种拓展,本质是一种数组,用每个二进制位表示一种状态。即0表示不存在,表示存在。
下面我们举个栗子:
数据:{1,3,7,4,12,16,18,22,13,6}将这个集合存于位图之中。
第一步:判断一个数字应该存储于哪个位图之中。
第二步:判断一个数字应该存储于那个位图的哪一位之中。
第三步:找到该位,将位图的该位置为1。
如下图所示:
位图表示
用途:用来判断某个数字是否存在于一个大的数据之中。
若想看具体的实现代码,请戳->位图代码实现


布隆过滤器(bloom filter)

用途:可以用来判断一个字符串是否存在于一大堆的字符串之中。
布隆过滤器其实是哈希和位图的拓展,为了减少哈希冲突,使用多次哈希函数进行计算哈希地址。
具体代码请移步->布隆过滤器(其实是在位图的基础上实现的)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值