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

目录

一.引言

二.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 mmh3class BloomFilter:def __init__(self, size, hash_num):self.size = sizeself.hash_num = hash_numself.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.sizeself.bit_array[result] = 1def lookup(self, s):for seed in range(self.hash_num):result = mmh3.hash(s, seed) % self.sizeif 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.mzph.cn/news/623267.shtml

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

相关文章

【Python数据可视化】matplotlib之增加图形内容:设置图例、设置中文标题、设置网格效果

文章传送门 Python 数据可视化matplotlib之绘制常用图形:折线图、柱状图(条形图)、饼图和直方图matplotlib之设置坐标:添加坐标轴名字、设置坐标范围、设置主次刻度、坐标轴文字旋转并标出坐标值matplotlib之增加图形内容&#x…

书生·浦语大模型实战营笔记(四)

Finetune模型微调 直接使用现成的大语言模型,在某些场景下效果不好,需要根据具体场景进行微调 增量预训练:投喂垂类领域知识 陈述形式,无问答,即只有assistant 指令跟随:system-user-assistant XTuner …

springboot集成kafka消费数据

springboot集成kafka消费数据 文章目录 springboot集成kafka消费数据1.引入pom依赖2.添加配置文件2.1.添加KafkaConsumerConfig.java2.2.添加KafkaIotCustomProperties.java2.3.添加application.yml配置 3.消费者代码 1.引入pom依赖 <dependency><groupId>org.spri…

yolov7混淆矩阵

测试部分代码 import argparse import json import os from pathlib import Path from threading import Threadimport numpy as np import torch import yaml from tqdm import tqdmfrom models.experimental import attempt_load from utils.datasets import create_dataload…

10.Spring Type Convertion 原理

目录 概述Spring Type Convertion总结Spring MVC层的数据转换debug 关键断点测试代码关键处调试字符串Long结束概述 此篇文章对 Spring Type Convertion 做深入学习。 两个源码调试例子,一个是转换成 String ,一个转换成 Long 环境:spring boot 2.6.13 相关文章如下: 文章…

嵌入式培训机构四个月实训课程笔记(完整版)-C++和QT编程第二天-类与对象(物联技术666)

链接:https://pan.baidu.com/s/1Am83Ut449WCbuTiodwJWgg?pwd=1688 提取码:1688 上午:类和对象 下午:类和对象高级应用 教学内容: 1、构造函数\析构函数\拷贝构造函数 构造函数: 每一个对象的创建都必须初始化,如果在没有写初始化函数(即构造函数),系统会默认写…

OpenCV——八邻域断点检测

目录 一、理论基础1、八邻域2、断点检测 二、代码实现三、结果展示四、参考链接 OpenCV——八邻域断点检测由CSDN点云侠原创&#xff0c;爬虫自重。如果你不是在点云侠的博客中看到该文章&#xff0c;那么此处便是不要脸的爬虫。 一、理论基础 1、八邻域 图1 八邻域示意图 图…

基于嵌入式AI的ROI区域视频传输系统设计与实现

在当今快速发展的智能监控领域&#xff0c;实现高效的视频流处理和传输成为了一项重要挑战。本文介绍了一个基于嵌入式AI平台的视频传输系统设计&#xff0c;该系统能够识别视频中的关键区域&#xff08;ROI&#xff09;&#xff0c;并对这些区域进行高效的编码处理。特别地&am…

Python数据的处理

一.字符串拼接的几种方式 使用str.join()方法进行拼接字符串直接拼接使用格式化字符串进行拼接 ​ s1hello s2world #(1)使用➕进行拼接 print(s1s2) #(2)使用字符串的join&#xff08;&#xff09;方式 print(.join([s1,s2])) print(*.join([s1,s2])) print(你好.join([s1,s…

neus2安装运行纪实

./build/testbed --scene transforms.json

Python操作MySQL入门教程,使用pymysql操作MySQL,有录播直播私教课

创建数据库 create database gx character set utf8mb4;连接数据库 #!/usr/bin/python3import mysql as pymysql# 打开数据库连接 db pymysql.connect(hostlocalhost,port3306,userroot,passwordzhangdapeng520,databasegx)# 使用 cursor() 方法创建一个游标对象 cursor cur…

【MATLAB随笔】GUI编程(未完结)

文章目录 一、创建图窗1.1 figure 函数详解1.11 窗口标识1.12 窗口外观1.13 位置和大小 二、xxx 一、创建图窗 跟很多GUI编程一样的&#xff0c;先创建一个基本的图窗&#xff0c;然后再添加按钮、文章、标签&#xff0c;绑定函数等等&#xff0c;比如python的tkinter。 MATL…

C/C++算法从小白到高手(1):排序算法

1. 冒泡排序 (1) 基本思路 冒泡排序是一种简单的、但效率极低的排序算法&#xff0c;基本思路是重复地遍历待排序的序列&#xff0c;通过相邻元素的比较和交换&#xff0c;将较大&#xff08;或较小&#xff09;的元素逐步"冒泡"到右侧&#xff08;或左侧&#xff0…

文章解读与仿真程序复现思路——电网技术EI\CSCD\北大核心《考虑风电出力不确定性的电网无功-电压控制鲁棒分区方法》

本专栏栏目提供文章与程序复现思路&#xff0c;具体已有的论文与论文源程序可翻阅本博主免费的专栏栏目《论文与完整程序》 这个标题涉及到考虑风电出力不确定性的电网无功-电压控制鲁棒分区方法。让我们逐步解读这个标题的主要关键词和概念&#xff1a; 考虑风电出力不确定性…

android,app,小程序页面布局的各种栏

手机页面从上到下通常包含以下几个栏&#xff1a; 1.状态栏&#xff08;Status Bar&#xff09;&#xff1a;位于屏幕的顶部&#xff0c;用于显示手机的系统状态信息&#xff0c;例如时间、电池电量、信号强度等。状态栏也可以包含一些通知图标和快捷设置图标。 2.标题栏&…

根据编码规则使用nodejs脚本来大批量生成星原物联网设备采集点表

在使用星原网关时&#xff0c;需要导入点表&#xff0c;由于设备的点表非常的多&#xff0c;可写的点表有1095个。 所有根据编码规律&#xff0c;编写了一段nodejs代码&#xff0c;来生成点表。 一个编码有四部分组成&#xff0c; 分别是 [‘A’, ‘B’, ‘C’, ‘D’, ‘E’]…

CTF伪随机数爆破

要了解伪随机数的爆破首先你的先知道什么是PHP种子&#xff0c; 借用在rand()函数中&#xff0c;我们可以通过设置随机数种子来影响随机数的生成。例如&#xff0c;在rand()函数中加入了随机数种子编码后&#xff0c;每次运行程序将会生成同样的随机整数序列。这个就是伪随机数…

第28关 k8s监控实战之Prometheus(八)

大家好&#xff0c;我是博哥爱运维。从这节课开始&#xff0c;博哥计划引入golang&#xff08;简称go&#xff09;语言开发的一些内容&#xff0c;没有接触过go语言的同学也不用慌&#xff0c;我会尽量以一个新人的角度&#xff0c;去把这些go开发的内容讲得通俗一些。这节课还…

布隆过滤器四种实现(Java,Guava,hutool,Redisson)

1.背景 为预防大量黑客故意发起非法的时间查询请求&#xff0c;造成缓存击穿&#xff0c;建议采用布隆过滤器的方法解决。布隆过滤器通过一个很长的二进制向量和一系列随机映射函数&#xff08;哈希函数&#xff09;来记录与识别某个数据是否在一个集合中。如果数据不在集合中…

计算机毕业设计 基于Java的国产动漫网站的设计与实现 Java实战项目 附源码+文档+视频讲解

博主介绍&#xff1a;✌从事软件开发10年之余&#xff0c;专注于Java技术领域、Python人工智能及数据挖掘、小程序项目开发和Android项目开发等。CSDN、掘金、华为云、InfoQ、阿里云等平台优质作者✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精…