布隆过滤器 #
布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。 它实际上是一个很长的二进制向量和一系列随机映射函数。 布隆过滤器可以用于检索一个元素是否在一个集合中。 它的优点是空间效率和查询时间都比一般的算法要好的多, 缺点是有一定的误识别率和删除困难。
解决: 网页 URL 去重、垃圾邮件识别、大集合中重复元素的判断和缓存穿透等问题
本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 某样东西一定不存在或者可能存在。
相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。
HashMap 的问题 #
-
例如存储容量占比高,考虑到负载因子的存在,通常空间是不能被用满的,而一旦你的值很多例如上亿的时候,那 HashMap 占据的内存大小就变得很可观了。
-
还比如说你的数据集存储在远程服务器上,本地服务接受输入,而数据集非常大不可能一次性读进内存构建 HashMap 的时候,也会存在问题。
布隆过滤器的原理 #
当一个元素被加入集合时,通过 K 个散列函数将这个元素映射成一个位数组中的 K 个点,把它们置为 1。检索时,我们只要看看这些点是不是都是 1 就(大约)知道集合中有没有它了:如果这些点有任何一个 0,则被检元素一定不在;如果都是 1,则被检元素很可能在。
应用 #
在大数据场景应用比较多,比如 Hbase 中使用它去判断数据是否在磁盘上。
还有在爬虫场景判断 url 是否已经被爬取过。
叶王 © 2013-2024 版权所有。如果本文档对你有所帮助,可以请作者喝饮料。