【必会面试题】布隆过滤器

news2024/10/6 16:28:24

目录

      • 基本组成部分:
      • 工作原理:
      • 特点:
      • 一个简单的示例
      • 应用场景:

布隆过滤器(Bloom Filter)是一种空间效率极高且查询速度很快的概率型数据结构,用于测试一个元素是否属于一个集合。布隆过滤器的基本思想是在一个固定大小的位数组上使用多个哈希函数进行映射。

基本组成部分:

  1. 位数组(Bit Array):布隆过滤器的核心是一个大型的二进制位数组,初始化时所有位都设置为0。

  2. 哈希函数(Hash Functions):使用多个不同的哈希函数,当一个元素被加入布隆过滤器时,这个元素会被这k个哈希函数分别映射到位数组的不同位置,并将这些位置的比特位设为1。

工作原理:

  • 添加元素:要将一个元素添加到布隆过滤器中,先用k个哈希函数分别计算出k个位置,然后将这些位置的位设为1。

  • 由于使用了多个哈希函数,一个元素通常会导致位数组中的多个位置被置为1。但也因此节省很多空间。

  • 在这里插入图片描述

  • 查询元素:要检查一个元素是否在集合中,同样使用这k个哈希函数计算k个位置,如果所有这些位置的位都是1,则算法判断元素“可能”在集合中。但存在一定的误报率,即元素实际上并不在集合中,但由于哈希碰撞,计算出的位置也都是1。
    在这里插入图片描述

特点:

  • 空间效率高:相比直接存储元素或使用传统的数据结构,布隆过滤器使用更少的内存表示集合。

  • 查询速度快:查询过程只需要对k个位置进行访问,时间复杂度接近O(1)。

  • 误报率:布隆过滤器可能会报告元素在集合中,即使它实际上不在(假阳性)。但它绝不会报告元素不在集合中,如果元素确实存在(无假阴性)。

  • 不可删除性:一旦一个位被设置为1,就不能再回退,因此从布隆过滤器中删除元素比较困难,虽然有一些方法可以部分解决这个问题,但通常是以牺牲其他性能为代价的。

一个简单的示例

以下是一个布隆过滤器的简单代码。
java和redis都提供了好用的布隆过滤器第三方库,直接使用即可。

import java.util.BitSet;

public class BloomFilter {
    private static final int DEFAULT_SIZE = 2 << 24; // 默认位数组大小,可根据需要调整
    private static final int[] seeds = new int[]{7, 11, 13, 31, 37, 61}; // 哈希种子,可以增加以减少误报率
    private BitSet bitSet = new BitSet(DEFAULT_SIZE);
    private SimpleHash[] func;

    public BloomFilter() {
        func = new SimpleHash[seeds.length];
        for (int i = 0; i < seeds.length; i++) {
            func[i] = new SimpleHash(DEFAULT_SIZE, seeds[i]);
        }
    }

    // 添加元素
    public void add(Object value) {
        for (SimpleHash f : func) {
            bitSet.set(f.hash(value), true);
        }
    }

    // 查询元素是否存在
    public boolean contains(Object value) {
        if (value == null) {
            return false;
        }
        boolean ret = true;
        for (SimpleHash f : func) {
            ret = ret && bitSet.get(f.hash(value));
        }
        return ret;
    }

    // 简单的哈希函数实现
    private static class SimpleHash {
        private int cap;
        private int seed;

        public SimpleHash(int cap, int seed) {
            this.cap = cap;
            this.seed = seed;
        }

        // 使用哈希函数计算位置
        public int hash(Object value) {
            int h;
            return (value == null) ? 0 : Math.abs(seed * (cap - 1) & ((h = value.hashCode()) ^ (h >>> 16)));
        }
    }
}

// 使用示例
public class Main {
    public static void main(String[] args) {
        BloomFilter filter = new BloomFilter();
        filter.add("test");
        filter.add("example");
        System.out.println(filter.contains("test")); // 应返回 true
        System.out.println(filter.contains("absent")); // 可能返回 false 或者由于误报返回 true
    }
}

应用场景:

  • 缓存系统(重点):判断一个键值是否可能在缓存中,减少不必要的缓存查找或数据库查询。避免缓存穿透。

  • 网页爬虫去重:避免重新抓取已经访问过的URL。

  • 数据库查询优化:作为初步筛选,减少对主数据库的查询次数。

  • 垃圾邮件过滤:快速排除已知的非垃圾邮件地址。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1811983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【CGAL】Region_Growing检测圆柱,保存结果并输出圆柱体参数

目录 说明代码展示结果展示问题说明 说明 这篇博客以代码为主&#xff0c;使用CGAL中的region growing方法检测圆柱体。将不同的圆柱按不同颜色保存&#xff0c;并输出圆柱体的中心坐标、轴方向以及半径。 region growing的具体思想网上的文章已经有很多&#xff0c;可以参考这…

万界星空科技定制化MES系统,实现数字化生产

一、MES生产管理系统强调三个方面&#xff1a; 1、MES是对整个车间制造过程的优化&#xff0c;而不是单一的解决某个生产瓶颈。 2、MES必须提供实时收集生产过程中数据的功能&#xff0c;并作出相应的分析和处理。 3、MES需要与计划层和控制层进行信息交互&#xff0c;通过企业…

算法day25

第一题 394. 字符串解码 解法&#xff1a;模拟栈的完成上述的操作&#xff1b; 分析&#xff1a; 下面以如图的字符串来分析&#xff1b; 首先定义一个数字栈用来存放数字&#xff0c;同时定义一个容器stringbuffer栈&#xff0c;里面用来存放字符串&#xff1b; 1、遇到数字&…

若依RuoYi-Vue分离版—配置多数据源

若依RuoYi-Vue分离版—配置多数据源 一、修改application-druid.yml二、修改pom文件&#xff0c;引入依赖第一种&#xff1a;下载jar包到本地&#xff0c;然后引入&#xff08;我这边用的是这种&#xff09;本地引入的&#xff0c;打包时需要加上配置 第二种&#xff1a;从远程…

JAVA开发 使用Apache PDFBox库生成PDF文件,绘制表格

1. 表格位置定点 2.执行效果展示&#xff08;截取PDF文件图片&#xff09; 3.执行代码 当我们使用Apache PDFBox库在PDF文件中创建带有表格的内容&#xff0c;需要遵循几个步骤。PDFBox本身并没有直接的API来创建表格&#xff0c;但我们可以通过定位文本、绘制线条和单元格矩形…

如何在Visual Studio Code中禁用Less文件保存时自动编译为CSS的功能

第一步&#xff1a;点击扩展&#xff0c;搜索Easy Less&#xff0c;并找到对应的扩展设置 第二步&#xff1a;点击在setting.json中编辑 第三步&#xff1a;将此段代码复制粘贴 "compress": false, // 是否压缩"sourceMap": false, // 是否生成map文件&am…

揭秘ASA归因统计的奥秘,Xinstall带您轻松上手!

在移动互联网时代&#xff0c;App推广已成为企业获取用户、提升品牌知名度的重要手段。然而&#xff0c;如何准确衡量推广效果&#xff0c;如何精准定位目标用户&#xff0c;一直是困扰着众多App运营者的难题。今天&#xff0c;我们就来谈谈ASA&#xff08;Apple Search Ads&am…

怎么监控电脑屏幕上的画面?监控电脑屏幕的优秀软件有哪些

怎么监控电脑屏幕上的画面呢&#xff1f;当然是用监控软件啦&#xff0c;它的功能超乎你的想象&#xff0c;下面我将详细介绍如何使用监控软件来监控屏幕&#xff0c;内容将包含监控软件的选择、安装、配置以及具体监控功能的实现等方面。 一、选择监控软件 在选择监控软件时&…

SonarQube安全扫描常见问题

目录 一、SonarQube质量报告 二、SonarQube扫描常见问题和修复方法 三、SonarQube质量配置 最近小编在使用SonarQube工具进行代码扫描&#xff0c;检查代码异味&#xff0c;系统漏洞等&#xff0c;实际过程中也遇到了不少问题&#xff0c;这篇文章主要列举我遇到的常见问题和…

鸿蒙开发文件管理:【@ohos.document (文件交互)】

文件交互 说明&#xff1a; 本模块首批接口从API version 6开始支持。后续版本的新增接口&#xff0c;采用上角标单独标记接口的起始版本。本模块接口后续将废弃。不建议在OpenHarmony使用以下接口&#xff0c;调用以下接口将抛出异常。 导入模块 import document from ohos.d…

H1B签证/年薪近$6.5万|美国加州大学戴维斯分校博士后申请成功

N博士信息与通信工程专业毕业,希望到美国加州及周边地区从事博士后工作&#xff0c;且最好是H1B签证。我们为其申请到美国加州大学洛杉矶分校及戴维斯分校的职位&#xff0c;年薪为64,480美元&#xff0c;最终其选择可以办理H1B签证的加州大学戴维斯分校。 N博士背景&#xff1…

Django中配置日志

在Django中配置日志的方法非常简单&#xff0c;只需要在 setting 文件中添加配置项&#xff0c;系统会自动生成相应的日志文件&#xff0c;也可以配置调试时显示内容&#xff0c;报错发送邮件等操作。 在setting.py中添加以下配置。 # 日志配置 LOGS_DIRS os.path.join(BASE…

解决群晖NAS无法拉取docker镜像问题

一、问题描述 由于国内的docker已经被管控&#xff0c;直接在群晖NAS的docker面板上是无法直接查询到需要的docker镜像内容&#xff0c;我们需要通过SSH连接到群晖使用docker命令进行拉取镜像使用&#xff0c;如下图所示&#xff1a; 注意&#xff1a;若要通过SSH连接群晖NAS则…

【python中的转义字符】

在Python中&#xff0c;除了换行符&#xff08;\n&#xff09;和制表符&#xff08;\t&#xff09;&#xff0c;还有许多其他的转义字符和字符串格式化符号可以使用。以下是一些常见的例子&#xff1a; 1、常见的转义字符 ### 常见的转义字符 1. **换行符**: \n 2. **制表符*…

Odoo实现自动拉取gitee代码,自动升级模块

系统通过计划任务每天从指定的git仓库获取仓库tag,并存储在数据库中 系统管理员(base.group_system)每次刷新页面,在后台判断最新的tag是否已安装或已忽略来提醒是否有新的版本。 一、依赖 模块依赖python第三方包GitPython,安装方法: pip install GitPython GitP…

Camtasia Studio2024破解神器下载,轻松上手视频剪辑

嘿&#xff01;今天我要和大家分享一个神奇的软件——Camtasia Studio2024最新版的破解安装包&#xff01;&#x1f3ac; 作为一个视频制作爱好者&#xff0c;我一直在寻找一款功能强大、易于操作的视频编辑软件。而Camtasia Studio2024就是我心目中的完美选择&#xff01;它不…

二刷算法训练营Day28 | 回溯算法(4/6)

目录 详细布置&#xff1a; 1. 93. 复原 IP 地址 2. 78. 子集 3. 90. 子集 II 详细布置&#xff1a; 1. 93. 复原 IP 地址 有效 IP 地址 正好由四个整数&#xff08;每个整数位于 0 到 255 之间组成&#xff0c;且不能含有前导 0&#xff09;&#xff0c;整数之间用 . 分隔…

网络协议四

一、云中网络 物理机的劣势&#xff1a; 1&#xff09;一旦需要扩容 CPU、内存、硬盘&#xff0c;都需要去机房手动弄&#xff0c;非常麻烦 2&#xff09;采购的机器往往动不动几百 G 的内存&#xff0c;而每个应用往往可能只需要 4 核 8G 3&#xff09;一台机器&#xff0c;…

pnpm : 无法加载文件 C:\Users\xxxxx\AppData\Roaming\npm\pnpm.ps1,因为在此系统上禁止运行脚本。

vscode中执行pnpm install的时候&#xff0c;直接报了上面的错误。 解决&#xff1a; 然后输入&#xff1a;set-ExecutionPolicy RemoteSigned&#xff0c;按回车&#xff0c;然后根据提示&#xff0c;我们选A。 然后回车。 这样我们再次回到vscode中的我们就会发现可以了。 …

数字化浪潮下的制造业:WMS仓储系统功能与优势深度解析-亿发

近年来&#xff0c;国内经济增速放缓&#xff0c;中美贸易摩擦加剧&#xff0c;以及制造业产业迁移等因素&#xff0c;使得制造业面临着产能过剩和激烈竞争的局面。制造企业的仓库中常常堆积着大量原材料和积压的成品、半成品&#xff0c;这些库存占用了企业的大量流动资金&…