白话布隆过滤器BloomFilter
查找问题的一般思路
布隆过滤器的基本原理
布隆过滤器的典型应用
布隆过滤器的工程实现
1.查找问题的一般思路
给你A,B两个文件,各存放50亿条URL,每条URL占用64字节,内存限制是4G,让你找出A,B文件所有共同的URL。
某知名公司面试题
线性结构:数组、链表、
容器结构:集合、Map、HashTable
树形结构:AVL、RBTree、BTree
把待查数据进行信息无缺失地压缩
借助于存储容器来存储辅助信息
2.布隆过滤器的基本原理
布隆过滤器的定义
布隆过滤器Bloom Filter是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率和删除困难。
维基百科-BloomFilter
布隆过滤器横向对比
如果想判断一个元素是不是在一个集合里,一般是将集合中所有元素保存起来,然后通过比较确定。链表、树、哈希表等数据结构都是这种思路。但是集合元素的增加需要的存储空间越大,检索速度也越慢。
维基百科
布隆过滤器的基本原理
布隆过滤器的两大组件
一定大小的BitAarry位阵列(具体大小和存储规模有关)
N个优秀的哈希函数(N的个数和存储规模和容忍误判率有关)
布隆过滤器和哈希冲突
(侵权请告之删除)
布隆过滤器的具体使用
布隆过滤器和误判率
布隆过滤器存在一定的误判,主要因素包括:
哈希函数本身的冲突率
bitarray位数组的大小
布隆过滤器的优缺点
相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外,散列函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。布隆过滤器可以表示全集,其它任何数据结构都不能;
维基百科--布隆的优点
误算率是其中之一,随着存入的元素数量增加,误算率随之增加,但是如果元素数量太少,则使用散列表足够。另外一般情况下不能从布隆过滤器中删除元素。
维基百科--布隆的缺点
3.布隆过滤器的典型应用
检查单词拼写正确性
检测海量名单嫌疑人
垃圾邮件过滤
搜索爬虫URL去重
缓存穿透过滤
4.布隆过滤器的工程实现
位数组和哈希函数个数的计算
bitarray位数组的大小m
哈希函数的个数k
多个哈希函数的优化
工程组件
5.参考资料
https://www.jianshu.com/p/af6c63822da8
https://juejin.im/post/5c9b61576fb9a070f653557d
https://segmentfault.com/a/1190000015482091
https://www.kancloud.cn/kancloud/the-art-of-programming/41619
https://segmentfault.com/a/1190000012620152
https://www.eecs.harvard.edu/~michaelm/postscripts/rsa2008.pdf