【高级程序设计语言C++】布隆过滤器

news2025/1/19 17:20:20

  • 1. 布隆过滤器的概念
  • 2. 布隆过滤器的简单实现
    • 2.1. 布隆过滤器的长度和哈希函数的个数
    • 2.2. 布隆过滤器的结构
      • 2.2.1. 插入
      • 2.2.2. 查询
      • 2.2.3. 误判率的测试
    • 2.3. 布隆过滤器的删除

1. 布隆过滤器的概念

布隆过滤器(Bloom Filter)是一种用于快速判断一个元素是否属于一个集合的概率型数据结构。它通过使用多个哈希函数和位数组来实现。需要注意的是,布隆过滤器是一个概率型的数据结构,它可以高效地判断一个元素不在集合中,但存在一定的误判率。误判率取决于哈希函数的数量和位数组的大小。在实际应用中,可以根据需求调整哈希函数的数量和位数组的大小,以达到合适的误判率。

举个例子:

假如有一堆字符串,要求查询某个字符串是否存在里面?

如果使用哈希函数对每个字符串都求出哈希值,然后放进位图里面,我们是不是就可以知道某个字符串是否存在里面了。

按道理是可以的,但是面对字符串哈希值相等的情况,就会面临误判率高的问题。针对误判率高的问题,我们可以使用布隆过滤器。

布隆过滤器其实针对一个元素,在一个位图里,利用不同的哈希函数,对该元素多次映射,从而达到误判率降低效果的数据结构。

具体如下图:

img

第一个哈希函数求出了 code 和 cedo 相同的哈希值,此时会存在误判的问题

第二个哈希函数求出了 code 和 cedo 不相同的哈希值,此时通过判断第一个哈希值位置的标记是不是为1,为1并且第二个哈希函数的哈希值位置的标记也为1,则说明存在。

注意:

  1. 判断一个元素存在是不准确的,因为该数据结构只是降低误判率,并不是直接精准的判断存在。
  2. 判断一个元素不存在是准确的

2. 布隆过滤器的简单实现

2.1. 布隆过滤器的长度和哈希函数的个数

img

如知乎大佬所给的图一样,哈希函数越多,误判率越低。关于长度,大佬也给出了公式:

img

根据上面的公式可以得出, m = k * n / 0.7;

2.2. 布隆过滤器的结构

img

2.2.1. 插入

void set(const K& key)
{
    size_t hash1 = Hashfunc1()(key) % (N * X);
    size_t hash2 = Hashfunc2()(key) % (N * X);
    size_t hash3 = Hashfunc3()(key) % (N * X);
    
    _bs.set(hash1);
    _bs.set(hash2);
    _bs.set(hash3);
}

2.2.2. 查询

bool test(const K& key)
{
    size_t hash1 = Hashfunc1()(key) % (N * X);
    if (!_bs.test(hash1))
    {
        return false;
    }
    size_t hash2 = Hashfunc2()(key) % (N * X);
    if (!_bs.test(hash2))
    {
        return false;
    }
    size_t hash3 = Hashfunc3()(key) % (N * X);
    if (!_bs.test(hash3))
    {
        return false;
    }
    return true;
}

2.2.3. 误判率的测试

void test_bloomfilter2()
{
	srand(time(0));
	const size_t N = 100000;
	BloomFilter<N> bf;

	std::vector<std::string> v1;
	std::string url = "https://www.cnblogs.com/-clq/archive/2012/05/31/2528153.html";

	for (size_t i = 0; i < N; ++i)
	{
		v1.push_back(url + std::to_string(i));
	}

	for (auto& str : v1)
	{
		bf.set(str);
	}

	// v2跟v1是相似字符串集,但是不一样
	vector<string> v2;
	for (size_t i = 0; i < N; ++i)
	{
		std::string url = "https://www.cnblogs.com/-clq/archive/2012/05/31/2528153.html";
		url += std::to_string(999999 + i);
		v2.push_back(url);
	}

	size_t n2 = 0;
	for (auto& str : v2)
	{
		if (bf.test(str))
		{
			++n2;
		}
	}
	cout << "相似字符串误判率:" << (double)n2 / (double)N << endl;

	// 不相似字符串集
	std::vector<std::string> v3;
	for (size_t i = 0; i < N; ++i)
	{
		string url = "zhihu.com";
		url += std::to_string(i + rand());
		v3.push_back(url);
	}

	size_t n3 = 0;
	for (auto& str : v3)
	{
		if (bf.test(str))
		{
			++n3;
		}
	}
	cout << "不相似字符串误判率:" << (double)n3 / (double)N << endl;
}

运行结果:

img

以上代码只是用了三个哈希函数,有兴趣的读者可以自行增加哈希函数来测试哈希函数对于误判率的影响。

这里关于字符串的哈希函数,我也是在网上找到了一篇文章,有兴趣可以看看,字符串各种哈希函数

2.3. 布隆过滤器的删除

一般布隆过滤器是不支持删除的,因为有可能某个位置是被很多元素共同使用的,你删除了某个元素,意味着某个位置是要置0的,那么就会影响其他元素,所以一般不支持删除的。

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

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

相关文章

前端实习day30

今天又是一个繁忙的一天&#xff0c;加功能&#xff0c;改样式&#xff0c;改得头皮发麻&#xff0c;预定的任务还是没能完成&#xff0c;改起来真得太头疼&#xff0c;代码太乱了&#xff01;&#xff01;昨天那个bug&#xff0c;今天问了一下同事&#xff0c;不到五分钟就解决…

【面试八股文】每日一题:谈谈你对线程的理解

每日一题-Java核心-谈谈你对线程的理解【面试八股文】 Java线程是Java程序中的执行单元。一个Java程序可以同时运行多个线程&#xff0c;每个线程可以独立执行不同的任务。线程的执行是并发的&#xff0c;即多个线程可以同时执行。 1. 线程的特点 Java中的线程有如下的特点 轻…

背包问题 - 动态规划

1. 背包问题总结 暴力的解法是指数级别的时间复杂度。进而才需要动态规划的解法来进行优化&#xff01; 背包问题是动态规划&#xff08;Dynamic Planning&#xff09; 里的非常重要的一部分,关于几种常见的背包&#xff0c;其关系如下&#xff1a; 2. 01背包 01背包问题是…

离谱,居然还有网络工程师不懂什么是Overlay网络?

下午好&#xff0c;我是老杨。 伴随着网络技术的发展&#xff0c;数据中心的二层组网结构早已出现了阶段性的架构变化。 数据中心网络分为了Underlay和Overlay两个部分&#xff0c;网络进入了Overlay虚拟化阶段。 很多小友希望能多输出一些新技术&#xff0c;这不&#xff0c…

去年校招面试中Hadoop高频都问些什么?秋招在即,快收藏!

1 总述 校招是远不同于社招的&#xff0c;企业对学生的要求更多的是一些概念性的东西&#xff0c;即所谓的八股文。但有些场景类的题目也是会涉及到&#xff0c;尤其是在一些中大厂的面试题中。场景题固然是能不能中大厂中必不可少的部分&#xff0c;但是基础牢不牢才是能不能…

Docker安装基础使用练习

目录 1、安装Docker-CE 1&#xff09;简单使用yum方式安装 ! 2&#xff09;配置镜像加速&#xff1a; 2、下载系统镜像&#xff08;Ubuntu、 centos&#xff09; 1&#xff09;先查看我们所需的镜像有哪些版本。使用search命令&#xff01; 2&#xff09;下载镜像使用的是pul…

Elasticsearch 查询之Function Score Query

前言 ES 的主查询评分模式分为两种&#xff0c;是信息检索领域的重要算法&#xff1a; TF-IDF 算法 和 BM25 算法。 Elasticsearch 从版本 5.0 开始引入了 BM25 算法作为默认的文档评分&#xff08;relevance scoring&#xff09;算法。在此之前&#xff0c;Elasticsearch 使…

第 4 章 链表(1)

4.1链表(Linked List)介绍 链表是有序的列表&#xff0c;但是它在内存中是存储如下 小结: 链表是以节点的方式来存储,是链式存储每个节点包含 data 域&#xff0c; next 域&#xff1a;指向下一个节点.如图&#xff1a;发现链表的各个节点不一定是连续存储.链表分带头节点的链…

forEach时候,Exception in thread “AWT-EventQueue-0“ java.util.ConcurrentModificat

问题分析&#xff1a; 在很多容器中&#xff0c;都有一个变量记录你从结构上修改此容器的次数&#xff0c;叫做modCount&#xff0c;查看ArrayList的add()和remove()方法就可以发现&#xff0c;每次你调用add方法()向容器里面增加了一个元素&#xff0c;或者你调用Remove()方法…

每日一博 - MPP(Massively Parallel Processing,大规模并行处理)架构

文章目录 概述优点缺点小结 概述 MPP&#xff08;Massively Parallel Processing&#xff0c;大规模并行处理&#xff09;架构是一种常见的数据库系统架构&#xff0c;主要用于提高数据处理性能。它通过将多个单机数据库节点组成一个集群&#xff0c;实现数据的并行处理。 在 …

PAT 1018 Public Bike Management

个人学习记录&#xff0c;代码难免不尽人意。 There is a public bike service in Hangzhou City which provides great convenience to the tourists from all over the world. One may rent a bike at any station and return it to any other stations in the city. The Pu…

微服务基础概念【内含图解】

目录 拓展补充&#xff1a; 单体架构 分布式架构 面向服务的体系结构 云原生 微服务架构 什么是微服务&#xff1f; 微服务定义 拓展补充&#xff1a; 单体架构 单体架构&#xff1a;将业务的所有功能集中在一个项目中开发&#xff0c;最终打成一个包部署 优点&#x…

Hlang--用Python写个解释器

文章目录 前言流程数学解释器结果封装数的操作运行时异常运行解释实现总结前言 没错今天提前来做这个东西,昨天晚上干这个玩意差不多干了两个多小时才搞定,导致凌晨2点才睡觉,最要命的是,写着写着突然想到有一道线代理解错了,一个晚上,做梦全是这两个东西。尤其是晚上效…

一篇学会软硬链接|快捷方式|操作系统|centos7

前言 那么这里博主先安利一些干货满满的专栏了&#xff01; 首先是博主的高质量博客的汇总&#xff0c;这个专栏里面的博客&#xff0c;都是博主最最用心写的一部分&#xff0c;干货满满&#xff0c;希望对大家有帮助。 高质量博客汇总https://blog.csdn.net/yu_cblog/categ…

安装和配置 Ansible

安装和配置 Ansible 按照下方所述&#xff0c;在控制节点 control.area12.example.com 上安装和配置 Ansible&#xff1a; 安装所需的软件包 创建名为 /home/curtis/ansible/inventory 的静态清单文件&#xff0c;以满足以下要求&#xff1a; node1 是 dev 主机组的成员 node2 …

【C语言】字符串和内存函数的介绍 -- 详解

重点介绍处理字符和字符串的库函数的使用和注意事项。 C语言中对字符和字符串的处理很是频繁&#xff0c;但是C语言本身是没有字符串类型的&#xff0c;字符串通常放在常量字符串中或者字符数组中。字符串常量适用于那些对它不做修改的字符串函数。 一、求字符串长度⚪strlen …

LC-对称二叉树

LC-对称二叉树 链接:https://leetcode.cn/problems/symmetric-tree/description/ 描述&#xff1a;给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 例1&#xff1a; 输入&#xff1a;root [1,2,2,3,4,4,3] 输出&#xff1a;true 例2&#xff1a; 输入&…

【C++】—— 详解AVL树

目录 序言 &#xff08;一&#xff09;AVL树的概念 1、AVL树的由来 2、AVL树的特点 3、平衡因子 &#xff08;二&#xff09;AVL树的插入 1、插入操作的思想理解 2、AVL树的旋转 1️⃣ LL平衡旋转&#xff08;右单旋转&#xff09; 2️⃣ RR平衡旋转&#xff08;左单…

基于Canal实现MySQL 8.0 数据库数据同步

前言 服务器说明 主机名称操作系统说明192.168.11.82Ubuntu 22.04主库所在服务器192.168.11.28Oracle Linux Server 8.7从库所在服务器 版本说明 <span style"color:#000000"><span style"background-color:#ffffff"><code class"la…

carla中lka实现(二)

前言&#xff1a; 首先计算之前检测出来的车道线的中线与输入图像的中线进行计算距离&#xff0c;&#xff0c;并设置不同的阈值对于不同的方向进行相关的调整。 一、车辆中心线 一般而言将摄像头架设在车辆的正中心轴上&#xff0c;所获得的图像的中间线极为车辆的中心。 …