C++——位图和布隆过滤器

在C++中,哈希这种思想的应用场景有很多,位图就是其中的一种。

位图

位图:位图是一种哈希思想的产物,可以通过它来对数据进行快速的查找的方法,在位图中,有2种状态来表示在或者不在,即1/0。

位图应用场景

设想一下,如果给定10000个数据,让你判断其中的元素存不存在,你有几种方法?

1.用unordered_map来进行元素和个数的映射,如果存在就返回true
2. 排序+二分的思想
3. set + find

这时,我们发现1w个数据好像都可以用这种方式来查找,内存放得下,但是当数据量足够大的时候,我们就不能将数据直接放到内存中,这时我们就需要用到位图了。

一个字节 = 8bit,用每一个bit来表示存不存在,这大大减少了空间。

在这里插入图片描述

下面看bitset的简单定义

template<size_t N>class bitset{public:bitset(){_bits.resize(N / 32 + 1, 0);}//将元素对应的下标标志为1void set(size_t x){assert(x <= N);size_t i = x / 32;size_t j = x % 32;_bits[i] |= (1 << j);}void reset(size_t x){assert(x <= N);size_t i = x / 32;size_t j = x % 32;_bits[i] &= ~(1 << j);}bool test(size_t x){assert(x <= N);size_t i = x / 32;size_t j = x % 32;return _bits[i] & (1 << j);}private:vector<size_t> _bits;};

面试题:

给定100亿个整数,设计算法找到只出现一次的整数?

10亿字节 == 1GB
100亿个整数 == 400亿字节 == 40GB
可以发现,内存存放不下海量数据,用bitset就可以解决了。
我们定义2个位图00 来表示出现了0次的元素01表示出现了1次的元素10表示2次及以上的元素

	template<size_t N>class two_bit_set{public:void set(size_t x){// 00 -> 01if (_bs1.test(x) == false&& _bs2.test(x) == false){_bs2.set(x);}else if (_bs1.test(x) == false&& _bs2.test(x) == true){// 01 -> 10_bs1.set(x);_bs2.reset(x);}}//判断元素是否存在bool test(size_t x){if (_bs1.test(x) == false&& _bs2.test(x) == true){return true;}return false;}private:bitset<N> _bs1;bitset<N> _bs2;};

布隆过滤器

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询****,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。
在这里插入图片描述

实现原理:

布隆过滤器的结构:其实一个数组,如下图
在这里插入图片描述

当我们向布隆过滤器中插入baidu的时候,需要我们使用多个哈希函数来生成多个哈希值,将对应的位置置为1。baidu就是将1、4、7的位置设置为了1.
在这里插入图片描述

tencent就是将通过hash1、hash2、hash3函数来将对应的3、4、8设置为了1.
在这里插入图片描述

当我们去查询的时候,meituan的时候,如果通过布隆过滤器映射的位置是2、4、8,由于4是两个哈希值都将这个bit位设置为了1,8这个bit位在tencent中设置为了1,就只有2这个bit位没有设置为1,这是我们就可以说meituan这个值不存在

随着增加的值越多,被设置为1的位置也就越多,如果这是出现了一个“taobao”,即使它没有被存储过,但是对应的位置也有可能被其他存储的值通过映射设置为了1。 所以不能判断是存在的。

总结:
布隆过滤器:可以准确的判断一个值是不是不存在,但是不能肯定一个值存在

布隆过滤器的删除

布隆过滤器不能直接支持删除操作,因为在删除一个元素的时候,可能会影响其他元素

比如:删除上图中"tencent"元素,如果直接将该元素所对应的二进制比特位置0,“baidu”元素也被删除了,因为这两个元素在多个哈希函数计算出的比特位上刚好有重叠。一种支持删除的方法:将布隆过滤器中的每个比特位扩展成一个小的计数器,插入元素时给k个计数器(k个哈希函数计算出的哈希地址)加一,删除元素时,给k个计数器减一,通过多占用几倍存储空间的代价来增加删除操作

布隆过滤器的优点

  1. 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小无关
  2. 哈希函数相互之间没有关系,方便硬件并行运算
  3. 布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势
  4. 在能够承受一定的误判时,布隆过滤器比其他数据结构有这很大的空间优势
  5. 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能
  6. 使用同一组散列函数的布隆过滤器可以进行交、并、差运算

面试题:

给一个超过100G大小的log file, log中存着IP地址, 设计算法找到出现次数最多的IP地址?

在这里插入图片描述
接着我们继续定义一个priority_queue<piar<string,int>,lesser> minHeap;
然后将问题转化为topk问题。

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

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

相关文章

刷题日记——由浅入深的大数加法(高精度加法)

例题 代码 #include <cstdio>int main(){long long a,b;scanf("%lld %lld",&a,&b);printf("%lld\n",ab);}例题——高精度加法 编程计算&#xff1a;12345678912345678912121211231212121212121212121222222111112121&#xff1f; 分析 加…

来个自定义的电子木鱼吧

<!DOCTYPE html> <html><head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title>自定义木鱼</title> </head> <body style"background-…

题目:小怂爱水洼(蓝桥OJ 4234)

问题描述&#xff1a; 解题思路&#xff1a; 记录每个格子的水量&#xff0c;再比较找最大水量。计算水量使用dfs。 注意点&#xff1a;属于同一个水洼的每个格子&#xff0c;只需要计算一次dfs就好了&#xff0c;因为每个格子的dfs都相同 。 代码&#xff1a; #include <b…

VLAN间路由

部署了VLAN的传统交换机不能实现不同VLAN间的二层报文转发&#xff0c;因此必须引入路由技术来实现不同VLAN间的通信。VLAN路由可以通过二层交换机配合路由器来实现&#xff0c;也可以通过三层交换机来实现&#xff1b; VLAN间通讯限制 每个VLAN都是一个独立的广播域&#xff…

如何获取 Microsoft 365 Copilot

您已观看视频&#xff0c;也听到了相关讨论&#xff0c;您迫不及待地想要使用 Microsoft 365 Copilot。但在哪里可以找到它&#xff1f;何时可以使用它&#xff1f;本文提供详细信息。 可以执行哪些操作&#xff1f; Microsoft 365 Copilot 将无缝集成在用户每天使用的应用当…

rust 面向对象编程特性、模式与模式匹配、高级特征

面向对象编程OOP 学习了结构体、枚举&#xff0c;它们可以包含自定义数据字段&#xff0c;也可以定义内部方法&#xff0c;它们提供了与对象相同的功能。 面向对象的四大特征&#xff1a;封装、继承、多态 通过pub标记为公有的结构体&#xff0c;在其他模块中可以访问使用这…

红黑树平衡艺术:最大化与最小化红色结点比值的策略与实现

红黑树平衡艺术&#xff1a;最大化与最小化红色结点比值的策略与实现 一、 最大比值的红黑树构造1.1 伪代码示例&#xff1a;1.2 C代码示例&#xff1a; 三、最小比值的红黑树构造3.1 伪代码示例&#xff1a;3.2 C代码示例&#xff1a; 四、结论 红黑树是一种自平衡的二叉搜索树…

electron入门教程

Electron 快速上手教程 electron 简介 Electron是一个使用 JavaScript、HTML 和 CSS 构建桌面应用程序的框架。嵌入 Chromium 和 Node.js 到 二进制的 Electron 允许您保持一个 JavaScript 代码代码库并创建在Windows上运行的跨平台应用macOS和Linux不需要本地开发经验 Elec…

云知识库真的对企业很重要,提高工作效率的利器!

在今天的信息化时代&#xff0c;大数据、人工智能和机器学习等科技概念席卷各行各业。而作为这些潮流中不可忽视的一环&#xff0c;云知识库也越来越受企业们的青睐。云知识库&#xff0c;简单来说&#xff0c;就是在云端存储、管理和检索企业数据资讯的一种服务。那么云知识库…

开源中文大语言模型汇总

基于英文模型增量预训练的中文模型 LLama系列&#xff1a; llama作为开源社区的宠儿&#xff0c;有许多基于它的中文模型&#xff0c;下面列举比较流行的一些模型 hfl/chinese-llama-2&#xff1a;https://github.com/ymcui/Chinese-LLaMA-AlpacaLinly-Al/Chinese-LLaMA-2&a…

dfs,LeetCode 1026. 节点与其祖先之间的最大差值

一、题目 1、题目描述 给定二叉树的根节点 root&#xff0c;找出存在于 不同 节点 A 和 B 之间的最大值 V&#xff0c;其中 V |A.val - B.val|&#xff0c;且 A 是 B 的祖先。 &#xff08;如果 A 的任何子节点之一为 B&#xff0c;或者 A 的任何子节点是 B 的祖先&#xff0…

Linux高级IO——多路转接之select

文章目录 0. 前言1. 五种IO模型2. 非阻塞IO3. selectselect_serverselect缺点 0. 前言 在应用层用户调用read或者write方法读写的时候&#xff0c;本质上是是拷贝函数。 例如调用read的时候&#xff0c;如果底层接收缓冲区没有数据&#xff0c;那么就会阻塞式的等待&#xff1…

Berkeley CS

Eta Kappa Nu (HKN), Mu Chapter61 A计算机科学 61A — 计算机程序的结构和解释&#xff08;4 学分&#xff09; Python4 61 B计算机科学 61B — 数据结构&#xff08;4 学分&#xff09; Java4 61 C计算机科学 61C — 机器结构&#xff08;4 学分&#xff09;4 CS 70计算机…

真--开源个人收款系统方案--部署方案

继上文:真--个人收款系统方案,今天主要推出部署方案 1.下载源码 首先需要下载源码,源码地址:PayServer: 个人收款系统方案 - Gitee.com 并且pip下载依赖库: Flask2.5.1 Flask-Cors3.0.10 gevent23.6.0 websockets10.9 urllib31.26.1 2.修改配置 路径下有两个py文件&#xf…

Docker简单介绍、特点、与虚拟机技术的区别、核心概念及在CentOS 7 中安装卸载Docker

目录 一、什么是Docker 二、特点 三、Docker与虚拟机技术的区别 四、Docker的核心概念 Docker仓库与仓库注册服务器的区别 五、CentOS7在线安装Docker 安装配置 卸载 一、什么是Docker Docker是一个开源的容器化平台&#xff0c;用于打包、部署和运行应用程序。它利用…

C语言——找单身狗1

题目描述&#xff1a; 在一个整形数组中&#xff0c;只有一个数字出现一次&#xff0c;其他数组都是成对出现的&#xff0c;找出那个只出现一次的数字。 例如&#xff1a; 数组中&#xff1a;1&#xff0c;2&#xff0c;3&#xff0c;4&#xff0c;5&#xff0c;4&#xff0c;3…

【airtest】自动化入门教程(四)Poco元素定位

目录 一、基础操作 1、通过属性名等方式 2、通过属性组合 3、子节点方式 4、子节点加属性组合方式 5、孙节点offspring 6、兄弟节点sibling 7、父节点parent 8、正则表达式 9、直到某个元素出现 10、直到某个元素消失 二、通过局部坐标定位 1、使用局部坐标系的cli…

电商系列之风控安全

> 插&#xff1a;AI时代&#xff0c;程序员或多或少要了解些人工智能&#xff0c;前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。点击跳转到网站。 坚持不懈&#xff0c;越努力越幸运&#xff0c;大家…

使用Python的SQLite和Tkinter库来创建一个简单的查询

要使用Python的SQLite和Tkinter库来创建一个简单的查询系统&#xff0c;你可以遵循以下步骤&#xff1a; 安装所需的库&#xff1a; 如果你还没有安装sqlite3和tkinter库&#xff0c;可以使用pip进行安装。但通常&#xff0c;sqlite3是Python的标准库&#xff0c;而tkinter在大…

【Spring进阶系列丨第七篇】Spring框架新注解分类及详解

文章目录 一、Spring新注解1.1、Configuration注解1.1.1、定义一个类1.1.2、使用Configuration注解修饰类1.1.3、作用 1.2、Bean注解1.2.1、定义bean1.2.2、在主配置类中注册bean1.2.3、测试容器中是否有该bean1.2.4、注册bean的同时可以指定bean名称1.2.5、补充内容1.2.5.1、案…