Python - 深夜数据结构与算法之 BloomFilter

news2024/11/18 3:24:18

目录

一.引言

二.BloomFilter 简介

1.Hash Table

2.Bloom Filter

3.Bloom 示意图

4.Bloom 应用

三.Bloom Filter 实现

1.Python 实现

2.Python 测试

四.总结


一.引言

布隆过滤器 BloomFilter 是位运算在工业级场景应用的典范,其通过 bit 位保存元素是否存在,大大降低了判重所需的空间,下面我们看下其原理与实现。

二.BloomFilter 简介

1.Hash Table

假设原始元素为 String,这里通过一个 hash 函数就可以得到其对应的数组索引, 然后获取其相关信息。如果存在 Hash 冲突,例如 John Simith 与 Sandra Dee 的 Hash 值均为 152,此时一种方式是构造链表,然后 o(n) 的时间复杂度寻找当前 key 的信息。

2.Bloom Filter

工业级应用中一个场景的场景就是元素的去重,此时我们无需存储完整的 String,只需知道当前元素在不在表中即可,所以衍生了布隆过滤器。 

- 效率高

因为使用二进制向量,通过 bit 存储,所以空间效率非常高

- 误识别

参考上面 Hash 值相同的情况,A、B Hash 相同时,如果 A 已存在,则 B 判断时会造成误判

3.Bloom 示意图

应用场景中,二进制数组会非常大,同时元素不会只获取一个 Hash 值,而是通过多个 Hash 函数获取多个 Hash 值,再将对应位置索引置位 1。当我们判断 w 是否存在于表中时,我们将 w 分别用相同的 hash 函数去 hash,如果多个位置均为 1,则认为其已存在,否则不存在。

- hash 后索引有 0: 当前元素一定不存在

- hash 后索引全 1: 当前元素可能存在

如图所示,添加 AE 后的 Bloom Filter 在判断 B 是否存在时出现了误判。 此时布隆过滤器只是一个外置的快速查询缓存,当检测到 B 可能存在后,我们还会去后端的 DB 确认其是否存在;而对于 C 而言,我们直接将其添加至 Bloom 过滤器中即可。

4.Bloom 应用

网络节点的索引查询、分布式系统的节点查询以及一些过滤和缓存中经常使用 Bloom Filter 做前端的缓存。

三.Bloom Filter 实现

1.Python 实现

from bitarray import bitarray
import mmh3


class BloomFilter:
    def __init__(self, size, hash_num):
        self.size = size
        self.hash_num = hash_num
        self.bit_array = bitarray(self.size)
        self.bit_array.setall(0)

    def add(self, s):
        for seed in range(self.hash_num):
            result = mmh3.hash(s, seed) % self.size
            self.bit_array[result] = 1

    def lookup(self, s):
        for seed in range(self.hash_num):
            result = mmh3.hash(s, seed) % self.size
            if self.bit_array[result] == 0:
                return "Nope"
        return "Probably"

2.Python 测试

if __name__ == '__main__':
    bf = BloomFilter(500000, 7)
    bf.add("bit666")
    print(bf.lookup("bit666"))
    print(bf.lookup("bit678"))

bit666 -> Probably
bit678 -> Nope

虽然我们的 bit666 明面上看是存在的,但是为了返回的严谨性,这里返回的是 Probably 可能。

四.总结

这里简单介绍了 Bloom Filter 布隆过滤器的原理与实现方式,其需要初始化 ByteArray 存放下标,同时需要 k 个 hash 函数得到 hash_index。

除此之外还有误判概率 P 的计算,最佳 Hash 函数 K 的推导以及工业级应用代码博主放在另外一篇博客,有兴趣的同学可以加深学习: Bloom Filter 应用与推导。

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

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

相关文章

Linux/Traverxec

Enumeration nmap 使用nmap快速扫描目标,发现对外开放了22和80,第一个问题就是问80端口运行的是什么服务,针对这两个端口扫描对应的详细信息后就能得到答案 Nostromo 从nmap的扫描结果可以看到,目标开启了80端口,且…

MATLAB对话框与菜单设计实验

本文MATLAB源码,下载后直接打开运行即可[点击跳转下载]-附实验报告https://download.csdn.net/download/Coin_Collecter/88740733 一、实验目的 1.掌握建立控件对象的方法。 2.掌握对话框设计方法。 3.掌握菜单设计方法。 二、实验内容 建立如下图所示的菜单。菜单…

基于鸿蒙HarmonyOS 元服务开发一款公司运营应用(ArkTS API 9)

前言 最近基于Harmony OS最新版本开发了一个作品,本文来详细讲解一下,如何我是如何开发这个作品的。以及如何使用OpenHarmony,基于ArkTS,API 9来开发一个属于自己的元服务。 废话不多说,我的作品名称叫做Company Oper…

如何通过Burp Suite专业版构建CSRF PoC

Burp Suite是一款强大的渗透测试利器&#xff0c;可以利用它来高效的执行渗透攻击&#xff0c;接下来介绍如何通过Burp Suite Pro来构建CSRF PoC。 在Bupr中找到拦截的请求&#xff0c;右键选择Engagement tools > Generate CSRF PoC 利用CSRF PoC生成器自动生成HTML <h…

2.2 物理层

2.2 物理层 2.2.1 物理层的基本概念 1、物理层主要解决在各种传输媒体上传输比特0和1的问题&#xff0c;进而给数据链路层提供透明传输比特流的服务 2、由于传输媒体的种类太多&#xff08;例如同轴电缆、光纤、无线电波等&#xff09;&#xff0c;物理连接方式也有很多例如…

K8S--Ingress的作用

原文网址&#xff1a;K8S--Ingress的作用-CSDN博客 简介 本文介绍K8S的Ingress的作用。 ----------------------------------------------------------------------------------------------- 分享Java真实高频面试题&#xff0c;吊打面试官&#xff1a; Java后端真实面试题…

redis数据结构源码分析——跳表zset

文章目录 跳表的基本思想特点节点与结构跳跃表节点zskiplistNode属性 跳跃表链表属性 跳表的设计思想和优势API解析zslCreate&#xff08;创建跳跃表&#xff09;zslCreateNode&#xff08;创建节点&#xff09;zslGetRank&#xff08;查找排位&#xff09;zslDelete&#xff0…

【RPC】序列化:对象怎么在网络中传输?

今天来聊下RPC框架中的序列化。在不同的场景下合理地选择序列化方式&#xff0c;对提升RPC框架整体的稳定性和性能是至关重要的。 一、为什么需要序列化&#xff1f; 首先&#xff0c;我们得知道什么是序列化与反序列化。 网络传输的数据必须是二进制数据&#xff0c;但调用…

2019年认证杯SPSSPRO杯数学建模D题(第一阶段)5G时代引发的道路规划革命全过程文档及程序

2019年认证杯SPSSPRO杯数学建模 5G下十字路口车辆通行效率的讨论和建模 D题 5G时代引发的道路规划革命 原题再现&#xff1a; 忙着回家或上班的司机们都知道交通堵塞既浪费时间又浪费燃料&#xff0c;甚至有的时候会带来情绪上的巨大影响&#xff0c;引发一系列的交通问题。…

图像的初识

一、图像的数组表示 RGB能够构成人眼所能识别的所有颜色。 二、图像的变换 Example&#xff1a; img.shape Out[329]: (512, 768, 3) img.dtype Out[330]: dtype(uint8) #补值变换 shift_temp_img [255,255,255] - img shift_img Image.fromarray(shift_temp_img.astype(ui…

【REST2SQL】09 给Go的可执行文件exe加图标和版本信息等

【REST2SQL】01RDB关系型数据库REST初设计 【REST2SQL】02 GO连接Oracle数据库 【REST2SQL】03 GO读取JSON文件 【REST2SQL】04 REST2SQL第一版Oracle版实现 【REST2SQL】05 GO 操作 达梦 数据库 【REST2SQL】06 GO 跨包接口重构代码 【REST2SQL】07 GO 操作 Mysql 数据库 【RE…

关于2024年3月10日PMP考试的常见问题解答

2024年第一场PMP考试3月10日&#xff08;星期日&#xff09;举行&#xff0c;目前报名正在进行中。请参加了这次考试或者计划在2024年尽早取证的伙伴们抓紧报名&#xff0c;本次报名截止到1月18日。 说句题外话&#xff0c;PMP的考试安排越来越随性了&#xff0c;哈&#xff0…

MyBatis 入门指南:基本配置和使用

ORM——对象关系映射 O:对应的是java中的对象&#xff0c;一般是pojo&#xff08;实体类&#xff09; R:关系型数据库 M:映射,指java中对象映射到数据库表中对应的记录&#xff0c;或者是数据库表中对应记录映射成java中的对象 一个mybaties程序 1、添加依赖 <parent&g…

STM32存储左右互搏 SPI总线FATS读写FRAM MB85RS2M

STM32存储左右互搏 SPI总线FATS读写FRAM MB85RS2M 在中低容量存储领域&#xff0c;除了FLASH的使用&#xff0c;&#xff0c;还有铁电存储器FRAM的使用&#xff0c;相对于FLASH&#xff0c;FRAM写操作时不需要预擦除&#xff0c;所以执行写操作时可以达到更高的速度&#xff0…

大数据Doris(五十五):SQL函数之日期函数(三)

文章目录 SQL函数之日期函数(三) 一、SECOND(DATETIME date)

Python画球面投影图

天文学研究中&#xff0c;有时候需要画的并不是传统的XYZ坐标系&#xff0c;而是需要画一个形如这样子的球面投影图&#xff1a; 下面讲一下这种图怎么画 1. 首先要安装healpy包 pip install healpy 2. 然后导入包 如果之前安装过healpy&#xff0c;有的会提示不存在healpy…

将 RGB 转换为十六进制、生成随机十六进制

RGB与十六进制 RGB&#xff08;Red, Green, Blue&#xff09;和十六进制是两种常用的颜色表示方式。 RGB是一种加法混色模式&#xff0c;它通过调节红、绿、蓝三个颜色通道的亮度来混合出各种颜色。对于每个颜色通道&#xff0c;取值范围是0到255&#xff0c;0表示该通道对应…

如何使用Imagewheel搭建一个简单的的私人图床无公网ip也能访问

文章目录 1.前言2. Imagewheel网站搭建2.1. Imagewheel下载和安装2.2. Imagewheel网页测试2.3.cpolar的安装和注册 3.本地网页发布3.1.Cpolar临时数据隧道3.2.Cpolar稳定隧道&#xff08;云端设置&#xff09;3.3.Cpolar稳定隧道&#xff08;本地设置&#xff09; 4.公网访问测…

SpringCloud Aliba-Nacos-从入门到学废【2】

&#x1f95a;今日鸡汤&#x1f95a; 比起不做而后悔&#xff0c;不如做了再后悔。 ——空白《游戏人生》 目录 &#x1f9c8;1.Nacos集群架构说明 &#x1f9c2;2.三种部署模式 &#x1f37f;3.切换到mysql 1.在nacos-server-2.0.3\nacos\conf里找到nacos-mysql.sql 2.查…

【Docker篇】从0到1搭建自己的镜像仓库并且推送镜像到自己的仓库中

文章目录 &#x1f50e;docker私有仓库&#x1f354;具体步骤 &#x1f50e;docker私有仓库 Docker私有仓库的存在为用户提供了更高的灵活性、控制和安全性。与使用公共镜像仓库相比&#xff0c;私有仓库使用户能够完全掌握自己的镜像生命周期。 首先&#xff0c;私有仓库允许…