一文读懂 海量数据去重 带你认识布隆过滤器

无论任何数据结构 双链表 红黑树 b+树 b树 或者是哈希表 他们都有一个问题 就是搜索效率并不高 在面对海量数据 比如几十万用户发几十万个查询数据请求 我却要一个个去搜索数据是否存在时 非常的耗时 有些读者就要说了 哈希表搜索效率不是非常高嘛?

一个像 Yahoo,Hotmail 和 Gmai 那样的公众电子邮件(email)提供商,总是需要过滤来自发送垃圾邮件的人的垃圾邮件。一个办法就是记录下那些发垃圾邮件的 email 地址。由于那些发送者不停地在注册新的地址,全世界少说也有几十亿个发垃圾邮件的地址,将他们都存起来则需要大量的网络服务器。如果用哈希表,每存储一亿 个 email 地址, 就需要 1.6GB 的内存。然后将这些信息存入哈希表,由于哈希表的存储效率一般只有 50%,因此一个 email 地址需要占用十六个字节。一亿个地址大约要 1.6GB, 即十六亿字节的内存。因此存贮几十亿个邮件地址可能需要上百 GB 的内存。除非是超级计算机,一般服务器是无法存储的。

哈希表某一个桶内元素过多 不可避免的就会降低整个哈希表的效率 无论你是采用拉链法还是开放寻址法或者是其他一些规避哈希冲突的算法 都会使得搜索效率下降

我们想要一种数据结构 他的功能仅仅是快速判断一个数据是否存在我的数据库中 并且占用的空间不能太多 有没有这种数据结构呢? 有的 那便是布隆过滤器

布隆过滤器的思想

如果想判断一个元素是不是在一个集合里,一般想到的是将所有元素保存起来,然后通过比较确定。链表,树等等数据结构都是这种思路。但是随着集合中元素的增加,我们需要的存储空间越来越大,检索速度也越来越慢。可以通过一(多)个Hash函数将一(多)个元素映射成一(多)个位阵列(或者是位图)中的一(多)个点。这样一来,我们计算完哈希值,只要看看对应的点是不是 1 就知道可以集合中有没有它了。这就是布隆过滤器的基本思想。

布隆过滤器的特点

布隆过滤器是一种概率型数据结构,它的特点是高效地插入和查询,能确定某个字符串一定不存在或者可能存在。(注意:能判断一定不存在,但是不能判断一定存在,也就是只能知道100%不在里面,且有一定概率在里面)

布隆过滤器不存储具体数据,所以占用空间小,查询结果存在误差,但是误差可控,同时不支持删除操作(实现删除的思路:设置两个位图,将删除后的添加到删除位图,查询的时候两个位图都查询,如果第一个位图存在,再查删除位图,当删除位图不存在的时候该元素存在,否在表示已经被删除了)

布隆过滤器由一个位图和n个哈希函数构成
一文读懂 海量数据去重 带你认识布隆过滤器_第1张图片

 如上图 173key值我便进行多次哈希 并把位图内对应的值全部置为1

 一文读懂 海量数据去重 带你认识布隆过滤器_第2张图片

 那么聪明的读者又要问了 我怎么确定我应该选取多少个哈希函数和多大的位图呢 并且我的假阳率也必须很低才行 没关系 数学家帮你解决了这个问题 

一文读懂 海量数据去重 带你认识布隆过滤器_第3张图片

 有些读者又说了 我看不懂啊 上图的公式 那么请访问如下网站 便可以快速计算 

Bloom filter calculator 

那么有没有通俗易懂的接口直接调参数就可以使用布隆过滤器呢 有的 快去白嫖吧

http://gitlab.0voice.com/0voice/bloomfilter/tree/master

你可能感兴趣的:(数据结构与算法,散列表,数据结构,哈希算法,c++)