初级5 题目三 认识布隆过滤器

2023-11-17

1. 布隆过滤器的使用需求是:查询一个东西是否在一个集合中。例如现在有 100 亿个url被列为黑名单,每次用户访问到该 url 时,返回 false。如果单纯地使用 HashSet,至少 6400 亿字节内存的损耗。而布隆过滤器可以极大程度降低这种内存需求,实现该功能。但布隆过滤器是存在短板的,即失误率。但这种失误率不是被列为黑名单的 url 被判断不在黑名单中, 而是不在黑名单的 url 被判断在了黑名单中。简单来说,就是宁可错杀三千,不放过一个

2. 在面试官问这个问题时,首先讲一下经典解法。然后问面试官,该系统允许较低的失误率吗?如果允许,再说布隆过滤器

3. 首先,介绍一个 bit 数组,如果一个 int[] a = new int [1000],那么这个数组有 32000 个字节数,也就是 1000 大小的 int 数组可以看做是 32000 个大小的 bit 类型数组。如果此时需要将 30000 这个位置 bit 赋值为 1,如何操作?首先用 30000/32,看 30000 这个位置的 bit 在 int 类型数组的哪个位置,之后 30000%32,看 30000 这个 bit 在 int 类型位置的第几个 bit。通过除和模的运算,可以将 30000 这个位置的 bit 赋值为1。注意,1<<16,意思是左移16位,也就是只有第 16 个位置赋值为 1 了,其他还是 0

int[] arr = new int[1000];

int index = 30000;

int intIndex = index / 32;

int bitIndex = index % 32;

arr[intIndex] = (arr[intIndex] | (1 << bitIndex));

 

4. 布隆过滤器实际操作便是借助 bit 数组实现的。每个 url 通过 k 个哈希函数计算出 k 个哈希值,然后 k 个哈希值都 % m(m为bit数组的大小),然后将模出来的结果对应的 bit 位置设为1。当所有 url 都这样操作后,这个 bit 数组就是黑名单。如果新来的 url 经过 k 个哈希函数运算后,k 个 bit 位置均为 1,那么这个 url 就是在黑名单之中。由此也可以看出,会存在误伤的现象。如果 m 较小,黑名单的 url 将所有的 bit 位置都置为了1,那么每个新来的 url 都会被当做黑名单。直观上,空间 m 越大,失误率就会越低。

5. 在深入分析 m 和 k 之前,需要注意一点,空间 m 的大小与单个 url 的长度无关,只与 url 的总数量有关。无论单个 url 是 64 字节还是 128 字节,经过哈希运算,结果只有 0 和 1。空间 m 的大小实际上是由url 总数量和预期失误率决定的,m=-\frac{n*lnp}{(ln2)^{2}},其中 n 就是 url 总数量,p 是预期失误率。如果 url 数量 100 亿,p 为 0.0001 时,m 为 131,571,428,572 bit 大小,转为字节约为 16G 大小。和先前的 6400 G相比,所需空间缩小非常多。哈希函数个数 k 的公式为  k=ln2*\frac{m}{n}=0.7*\frac{m}{n},根据所需空间大小和 url 总数量确定,结果向上取整,此处约为 13 个。正因为这样 m 和 k 存在向上取整的情况,所以在选定好 m 和 k 后,实际失误率和预期失误率是有所不同的,此时需要计算实际失误率,公式为 p = (1-e^{-\frac{n*k}{m}})^{k} , 此题为十万分之六,和先前万分之一比,降低了一点。三个公式,决定了布隆过滤器的空间大小,哈希函数个数,实际失误率。

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

初级5 题目三 认识布隆过滤器 的相关文章

  • numpy广播机制

    NumPy的广播机制 文章目录 NumPy的广播机制 Broadcast 最简单的广播机制 稍微复杂的广播机制 广播机制到底做了什么 一个典型的错误案例 一个正确的经典示例 一种更便捷的计算方式 Broadcast 广播是numpy对不同形
  • 【计算机视觉

    文章目录 一 分割 语义相关 12篇 1 1 UniSeg A Unified Multi Modal LiDAR Segmentation Network and the OpenPCSeg Codebase 1 2 Learning S
  • IDEA导入eclipse项目

    第一步 File gt new gt Project from Existing Sources 导入已存在的项目 并选择要导入的文件或目录 第二步 选择eclipse选项 第三步 配置jdk 导入完成了 项目目录如图示 gt 开始配置mo

随机推荐

  • PCB 过孔简介

    做过 PCB 设计的最先了解的应该就是过孔了 因为有过孔的存在我们才能做出多层板 过孔应该是 PCB 中最简单的部分了 也是最容易被我们忽略的地方 常见的过孔分为两大类 1 用作各层之间的电气连接 2 用作器件的固定或定位 一 过孔的介绍
  • 如何判断三点共线

    如何判断三点共线 在二维坐标系中 给出三点A x1 y1 B x2 y2 C x3 y3 的坐标 判断三点共线的条件是 实质是判断有三个点组成的三角形面积为0 神爱世人 甚至将他的独生子 耶稣 赐给他们 叫一切信他的 不至灭亡 反得永生 圣
  • 智能制造面临的主要问题

    随着工业4 0的发展 工业互联网 智能制造 智能工厂等概念正在兴起 但从本质上讲 制造业的目标是利用大数据 人工智能 互联网等先进技术改造制造业 使制造业成为定制体验 创新交付的竞争核心 在逐步实施工业4 0和中国制造2025的背景下 国内
  • R语言-引用函数对象作为参数

    问题描述 如何在在R的函数中通过字符串调用别的函数 以下面为例子 testFun lt function Fun x lt 1 100 Fun x 解法 这个问题没什么其实很笨 就是想记录一下 1 直接调用 testFun lt funct
  • 文本后缀“SCRIPT_EXP”无效;未找到文文本运算符或文本运算符模板“operator ““““SCRIPT_EXP”

    今天下载了一份源码 然后在编译的时候出现了这个问题 我查阅了相关资料 解决方法有两个 下面列举一下 1 字符文件编码 Visual Studio编译器 首先选中代码当前页 然后文件 gt 打开 高级保存选项 选中GB2312 确定 2 空格
  • HBase篇(1)-特性与应用场景

    结束了Zookeeper篇 接下来我们来说下Google三驾马车之一BigTable的开源实现 HBase 要讲的内容暂定如下 这是第一篇我们先不聊技术实现 只讨论特性和场景 hbase的特点 千万级高并发 PB级存储 非结构化存储 动态列
  • 树莓派升级ubuntu mate 16.04 到 18.04

    gt gt gt sudo do release upgrade Checking for a new Ubuntu release Get 1 Upgrade tool signature 819 B Get 2 Upgrade tool
  • 理解 es6 class 中 constructor 方法 和 super 的作用

    首先 ES6 的 class 属于一种 语法糖 所以只是写法更加优雅 更加像面对对象的编程 其思想和 ES5 是一致的 function Point x y this x x this y y Point prototype toStrin
  • html鼠标经过状态,30种炫酷html5鼠标滑过图片标题显示效果

    这款插件集合和30种html5不同效果的鼠标滑过图片时标题动画效果 这个插件使用css 3D transforms和伪元素来制作动画效果 请确保你的浏览器支持这些css3特性 另外 在文本上使用css transitions时 火狐浏览器存
  • Appium 实现一个 apk 的二级页面的点击操作

    前言 在本文中 我们将介绍如何使用 Appium 和 Python 来实现一个 apk 的二级页面的点击操作 用例目标 实现一个 apk 的二级页面的点击操作 初始思路 进入到该界面的直接点击该 button 即可 遇到问题 1 启动不起来
  • Jenkins安装与入门(+Git+Docker)自动化交互

    https jenkins io zh yum install git y yum install jdk 8u171 linux x64 rpm y rpm qa grep java 如果过滤出open jdk 删掉防止冲突 yum in
  • 每天进步一点点【图的深度优先搜索与广度优先搜索】

    图是一种数据结构 其中节点可以具有零个或多个相邻元素 两个节点之间的连接称为边 节点也可以称为顶点 图分为三种 无向图 有向图 带权图 图的表示方式有两种 二维数组表示 邻接矩阵 链表表示 邻接表 邻接矩阵 邻接矩阵是表示图形中顶点之间相邻
  • R语言基本函数的学习(持续更新)

    目录 前言 Tidyverse包 arrange 函数 head 函数 filter 函数 select 函数
  • ubuntu server 14.04 启动 gnome(桌面) fail(失败)

    这个是不能进入gnome桌面 按alt f1登录后 执行命令 startx 就可以进入桌面显示了 具体是什么原因还不清楚 可以是安装一些软件或配置时候出现的问题吧 有人知道也可以告诉我原因 感谢
  • upload-labs通关详解

    目录 Pass 01 前端js验证 Pass 02 后端MIME验证 Pass 03 黑名单验证 Pass 04 黑名单验证 htaccess Pass 05大小写绕过 Pass 6 空格绕过 Pass 07 点绕过 Pass 08 DAT
  • 三极管的工作状态及电流关系

    三级管分为NPN和PNP两种 一 先来说说三极管3种工作状态的电压关系 1 放大 发射结正偏 集电结反偏 1 NPN UBE gt 0 UBC lt 0 2 PNP UBE lt 0 UBC gt 0 2 截止 放射结 集电结都反偏 1 N
  • STM32+W5500+MQTT使用记录

    第一次尝试写博客 不为别的 为了积累一些知识和记录下使用的遇到的问题 关于MQTT协议的介绍可以百度搜索或者在本论坛内查找 介绍的还是很多 而且介绍的很想学习 当然我也收藏了很多 一下主要介绍我使用时如何处理的 1 实现MQTT协议 要基于
  • 知识星球-伙伴匹配系统08

    伙伴匹配系统08 控制定时任务的执行 锁 分布式锁 分布式锁实现的关键 抢锁机制 注意事项 Redisson 实现分布式锁 2 种引入方式 定时任务 锁 控制定时任务的执行 为啥 浪费资源 想象 10000 台服务器同时 打鸣 脏数据 比如
  • 学生python编辑2--反弹的小球

    目录 上下反弹的小球 左右反弹的小球 碰边反弹的小球 上下反弹的小球 coding UTF 8 开发团队 信息化未来 开发人员 Administrator 开发时间 2022 8 21 17 52 文件名称 自动反弹的小球 py 开发工具
  • 初级5 题目三 认识布隆过滤器

    1 布隆过滤器的使用需求是 查询一个东西是否在一个集合中 例如现在有 100 亿个url被列为黑名单 每次用户访问到该 url 时 返回 false 如果单纯地使用 HashSet 至少 6400 亿字节内存的损耗 而布隆过滤器可以极大程度