查看“什么是布隆过滤器(BloomFilter)?”的源代码
←
什么是布隆过滤器(BloomFilter)?
跳到导航
跳到搜索
因为以下原因,您没有权限编辑本页:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
[[category:Redis]][[category:数据结构]] == 关于 == 布隆过滤器(Bloom Filter)是 1970 年由布隆提出的。它实际上是一个很长的'''二进制向量'''和一系列'''随机映射函数'''。 布隆过滤器可以用于'''检索一个元素是否可能在一个集合中'''。 * 优点:空间效率和查询时间都比一般的算法要好的多, * 缺点:有一定的误识别率,不能删除。 ** 其变种“Counting Bloom filter”可以用来测试元素计数个数是否绝对小于某个阈值,它支持元素删除。 === 通常判断某个元素是否存在用的是什么? === HashMap! : 将值映射到 HashMap 的 Key,然后可以在 O(1) 的时间复杂度内返回结果,效率奇高。 : [[File:HashMap实现集合中元素判断.jpg|600px]] 但是 HashMap 的实现也有缺点,例如存储容量占比高: : 考虑到负载因子的存在,通常空间是不能被用满的,而数据量大的时候,HashMap 占据的内存大小就变得很可观了。 由此就需要一种查询效率近似 HashMap,但空间占用更少的结构来进行大数据量的判断。 == 原理 == 布隆过滤器是一个 bit 向量或者说 bit 数组(仅包含 0 或 1 值): : [[File:布隆过滤器结构.jpg|400px]] 要映射一个值到布隆过滤器中,我们需要使用'''多个不同的哈希函数'''生成'''多个哈希值''',并将每个哈希值所指向的 bit 位置为 1: : 如下,添加元素“semlinker”: : [[File:布隆过滤器:添加元素1.jpg|400px]] : 如下,添加元素“kakuqo”: : [[File:布隆过滤器:添加元素2.jpg|400px]] 在进行元素判定时,同样通过多个哈希函数生成多个哈希值,并查找哈希值所指向的 bit 位: : 如下,查找元素“semlinker”: : [[File:布隆过滤器:添加元素1.jpg|400px]] : 如下,查找元素“fullstack”: : [[File:布隆过滤器:判断元素1.jpg|400px]] : 查找元素“bullshit”: : [[File:布隆过滤器:判断元素2.jpg|400px]] 可以看出,判定结果为:元素“semlinker”、“fullstack”都在集合中,“bullshit”不在集合中。 但是其实“fullstack”并不在其中,是误报。 * 产生误报的原因是由于哈希碰撞导致的巧合而将不同的元素存储在相同的比特位上。 如上,可以看出 Bloom Filter 的判定结果: # 哈希值比特位都为 1,元素'''可能'''在集合中; # 哈希值比特位有 0,元素'''一定不在'''集合中。 即,布隆过滤器用于'''检索一个元素是否可能在一个集合中'''。 == “哈希函数个数”(k)和“布隆过滤器长度”(m) == 哈希函数个数 与 布隆过滤器长度 直接影响 Bloom Filter 的效率: * 布隆过滤器的长度会直接影响误报率:布隆过滤器越长其误报率越小。 *: 布隆过滤器长度过小,则很快所有的 bit 位均为 1,那么查询任何值都会返回“可能存在”,起不到过滤的目的了; * 哈希函数的个数则需要在效率与误报率间平衡: *: 个数越多则布隆过滤器 bit 位置位 1 的速度越快,且布隆过滤器的效率越低;但是如果太少的话,那我们的误报率会变高。 以:k 为哈希函数个数,m 为布隆过滤器长度,n 为插入的元素个数,p 为误报率,其关系如下: :
返回至“
什么是布隆过滤器(BloomFilter)?
”。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
已展开
已折叠
查看
阅读
查看源代码
查看历史
更多
已展开
已折叠
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
笔记
服务器
数据库
后端
前端
工具
《To do list》
日常
阅读
电影
摄影
其他
Software
Windows
WIKIOE
所有分类
所有页面
侧边栏
站点日志
工具
链入页面
相关更改
特殊页面
页面信息