V

算法可视化

ZHEN
分享到微博分享到 XGitHub 仓库个人主页
学习工具算法复杂度速查算法学习路径
数据结构数组链表栈队列树堆哈希表图字典树并查集LRU 缓存跳表线段树B+ 树布隆过滤器树状数组
经典排序算法冒泡排序鸡尾酒排序双调排序选择排序插入排序二分插入排序希尔排序归并排序自顶向下归并快速排序三路快排双轴快排堆排序计数排序基数排序桶排序
图算法Dijkstra 最短路Kruskal 最小生成树Prim 最小生成树Bellman-Ford 最短路拓扑排序Floyd 多源最短路强连通分量2-SAT最大流二分图匹配LCA 倍增欧拉路径
动态规划编辑距离0-1 背包完全背包最长公共子序列最长递增子序列硬币找零方案数石子合并旅行商 TSP树形 DP数位 DP换根 DP
回溯与搜索N 皇后子集生成全排列组合总和迷宫寻路岛屿数量单词搜索数独A* 寻路
字符串KMP 字符串匹配Rabin-KarpBoyer-MooreManacher后缀数组LCP / height 数组AC 自动机Z 函数
数学与数论埃氏筛线性筛欧几里得算法快速幂扩展欧几里得中国剩余定理欧拉函数米勒-拉宾FFTPollard's Rho
计算几何凸包旋转卡壳最近点对线段相交扫描线求交
查找二分查找二分边界旋转数组搜索二分答案三分查找

布隆过滤器 Bloom Filter

数据结构 · 概率型「在不在」判断

什么是布隆过滤器

要判断「这个元素在不在一个海量集合里」,用哈希表存全部元素又费内存。布隆过滤器换个思路:只用一个位数组 + 几个哈希函数,不存原始元素,空间省到极致。代价是——它会「误判」。

加入元素:用 k 个哈希算出 k 个位置,把这些位都置 1。查询元素:算出同样 k 个位置,只要有一位是 0,就一定不在;如果全是 1,那「可能在」(也可能是别的元素把这些位凑成了 1——误判)。

这里是 m=16 位、k=3 个哈希的布隆过滤器。先「加入」几个数(比如 3、7、11),再「查询」:试试查 7(加过,命中)、查 5(有 0,一定不存在)、再查 2(没加过,但 3 个位恰好都被占了——误判!)。

亲手试试
m = 16 位 · k = 3 个哈希
00
01
02
03
04
05
06
07
08
09
010
011
012
013
014
015

先「加入」几个数(如 3、7、11),再「查询」——试试查 2,看什么是「误判」。

布隆过滤器的铁律:说「不在」就一定不在(绝不漏判),说「在」只是可能(会误判)。位数组越大、元素越少,误判率越低。标准布隆不支持删除(清一位可能影响别的元素),要删得用「计数布隆」。

布隆过滤器在哪里用

缓存穿透防护:先问布隆,「一定不存在」就不必查数据库。
爬虫 URL 去重 / 海量黑名单·白名单预筛。
大数据 join 前过滤:先用布隆刷掉绝不匹配的行。

它用「一点误判」换来「极省空间」——这趟结构之旅的最后一站,也是工程里最实用的近似数据结构之一。