posts - 339,  comments - 95,  views - 178万
< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5

参照 : http://billmill.org/bloomfilter-tutorial/

 

简介

布隆过滤器是一个用来判断某元素是否在全集中的工具.

实际上它是一个有 m 个槽的位图, 他拥有 k 个 hash 函数, 每个元素进来的时候会通过 k 个 hash 函数映射到任意 k 个槽中, 并将槽置为 1.

当需要判断某元素是否在过滤器中, 则通过 k 个 hash 函数 hash 过后看对应的槽是否为 1, 如果是, 则可能存在 (因为这些 1 可能是别的元素填充的), 如果有任意一个槽不为 1, 则必定不在过滤器中.

复杂度

由于有 k 个 hash 函数, 所以布隆过滤器的插入和查询复杂度都为 O(k), 而空间复杂度则难以计算, 一个是依赖你设置的 m 的大小, 另外一个是要看输入元素在 hash 后在过滤器中的稀疏程度

过大的 k 会导致时间复杂度上升, 而过小的 k 则会导致误判率上升, 例如 k = 1, 则退化成了只有一个 hash 函数的 hash table.

优点

它的优势在于不需要想 hashSet 或者 hashTable 那样存储实际的元素, 从而节省了空间, 同时又在你可以接受的误判范围内判断出元素是否在集合中. 

计算方法

布隆过滤器的误判率是可以计算的, 假设元素的全集个数为 n, 过滤器槽为 m, 共有 k 个函数, 那么误判率为 (1-e-kn/m)k

而最优的 k 值也是可以计算的, 公式为 (m/n)ln(2), 所以, 我们可以根据如下步骤来判定布隆过滤器的初始化大小 m

1. 决定你的元素输入个数 n 的大概值

2. 为 m 选一个值

3. 通过公式计算 k 的值

4. 通过公式计算 误判率, 假如不满意, 则回到 2. 重新选择 m 值, 直到得出满意的误判率

posted on   ZimZz  阅读(792)  评论(0编辑  收藏  举报
编辑推荐:
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
阅读排行:
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 地球OL攻略 —— 某应届生求职总结
· 提示词工程——AI应用必不可少的技术
· 字符编码:从基础到乱码解决
· Open-Sora 2.0 重磅开源!
点击右上角即可分享
微信分享提示