当前位置: 首页 > news >正文

布隆过滤器详解

布隆过滤器是什么?

布隆过滤器(Bloom Filter)是一种空间效率高的概率数据结构,主要用于测试一个元素是否在一个集合中。它的特点是可以快速判断某个元素是否在集合中,但可能会出现误判,即某个元素被判断为在集合中,但实际上并不在。布隆过滤器广泛应用于缓存穿透、数据库查询优化、网络爬虫、去重等场景.布隆过滤器遵循存在的不一定存在,不存在的一定不存在。

布隆过滤器的基本原理

布隆过滤器使用一个位数组和多个哈希函数来实现。其工作原理可以分为以下几个步骤:

  1. 初始化
    • 创建一个大小为 m 的位数组,所有位初始化为 0。
    • 选择 k 个独立的哈希函数,每个哈希函数将输入映射到位数组的一个位置。
  2. 添加元素
    • 当需要添加一个元素 x 到布隆过滤器时,使用 k 个哈希函数计算出 k 个位置。
    • 将位数组中这 k 个位置的值设置为 1。
  3. 查询元素
    • 当需要查询一个元素 y 是否在集合中时,同样使用 k 个哈希函数计算出 k 个位置。
    • 如果这 k 个位置的值全部为 1,则可以认为元素 y 可能在集合中;如果有任何一个位置的值为 0,则可以确定元素 y 不在集合中。

布隆过滤器的优缺点

优点

  • 空间效率高:布隆过滤器使用位数组,能够在很小的空间内存储大量元素。
  • 查询速度快:布隆过滤器的查询操作只需要进行 k 次哈希计算,时间复杂度为 O(k),非常快速。
  • 简单易用:布隆过滤器的实现相对简单,适合快速判断元素是否存在。

缺点

  • 误判:布隆过滤器可能会误判,即判断某个元素存在于集合中,但实际上并不存在。误判率与位数组大小和哈希函数数量有关。
  • 无法删除元素:标准的布隆过滤器不支持删除操作,因为删除某个元素可能会影响其他元素的查询结果。
  • 需要合理选择参数:在使用布隆过滤器时,需要根据预期插入的元素数量和可接受的误判率合理选择位数组大小和哈希函数数量。

应用场景

布隆过滤器在许多场景中得到了广泛应用,包括但不限于:

  1. 缓存穿透防护:在 Web 应用中,使用布隆过滤器来判断请求的数据是否存在,避免无效请求直接访问数据库。
  2. 去重:在大数据处理中,可以使用布隆过滤器来快速判断某个元素是否已经存在,避免重复处理。
  3. 网络爬虫:在爬虫系统中,使用布隆过滤器来判断某个 URL 是否已经被访问过,减少重复抓取。
  4. 数据库查询优化:在数据库中,使用布隆过滤器来快速判断某个数据是否存在,减少不必要的数据库查询。

应用例子’

import java.util.BitSet;
import java.util.Random;public class BloomFilter {private BitSet bitSet;private int size;private int hashCount;public BloomFilter(int size, int hashCount) {this.size = size;this.hashCount = hashCount;this.bitSet = new BitSet(size);}public void add(String value) {int[] hashes = getHashes(value);for (int hash : hashes) {bitSet.set(hash);}}public boolean contains(String value) {int[] hashes = getHashes(value);for (int hash : hashes) {if (!bitSet.get(hash)) {return false;}}return true;}private int[] getHashes(String value) {int[] hashes = new int[hashCount];Random random = new Random(value.hashCode());for (int i = 0; i < hashCount; i++) {hashes[i] = Math.abs(random.nextInt()) % size;}return hashes;}public static void main(String[] args) {BloomFilter bloomFilter = new BloomFilter(100, 5);bloomFilter.add("hello");System.out.println(bloomFilter.contains("hello")); // trueSystem.out.println(bloomFilter.contains("world")); // false}
}


http://www.mrgr.cn/news/16906.html

相关文章:

  • 数据赋能(194)——开发:数据服务——技术方法、主要工具
  • 005.Python爬虫系列_浏览器开发者工具(详解)
  • 【C++】智能指针——auto_ptr,unique_ptr,shared_ptr
  • kaggle平台free使用GPU
  • 使用Pywin32和其他库控制Office软件进行自动化操作
  • linux 内核网络分析 -- 分配并初始化socket
  • 12 事务
  • 通义说【线性代数】什么是线性
  • YoloV8实战:使用YoloV8实现OBB框检测
  • Atlas阿特拉斯wordpress主题
  • 四、Selenium操作指南(一)
  • 操作系统底层工作的整体认识
  • stm32 8080时序驱动lcd屏幕
  • 基于yolov8的驾驶员行为检测疲劳检测系统python源码+onnx模型+评估指标曲线+精美GUI界面
  • STM32CubeMX生成freertos默认设置卡死,卡在HAL_Init不动,裸机运行程序正常跑,解决方法
  • Kafka如何保证消息不丢失?
  • Docker容器技术
  • MIG IP核详解
  • 缓存穿透是什么?什么场景下会发生?如何解决?
  • 自制实战吃鸡手柄原理