C++ 哈希思想应用 位图 布隆过滤器 海量数据处理

news2025/1/10 12:01:41

文章目录

  • 问题引入
  • 位图(附C++模拟实现源码)
  • 布隆过滤器(附C++模拟实现源码)

问题引入

问题
给40亿个不重复的无符号整数,没排过序。给一个无符号整数,如何快速判断一个数是否在这40亿个数中。

问题分析
时间复杂度角度:

  1. 直接遍历,时间复杂度O(N);
  2. 以文件为单位进行归并排序(O(NlogN))+二分查找O(logN);
  3. 利用位图解决,时间复杂度0(1);
    空间复杂度角度:
  4. 如果利用 unordered_set 去建立哈希映射关系,在空间上是不够的 40亿个数如果使用开散列为底层, 那么仅仅是计算所开 结点 的内存大小就为 (16 * 40亿)byte,换算一下约为72GB ,非常不合理。
  5. 利用位图解决

位图(附C++模拟实现源码)

什么是位图?
位图,就是用每一bit位来存放某种状态,为1,代表存在,为0
代表不存在适,用于海量数据数据无重复的场景。通常是用来判断某个数据存不存在的。利用位图处理该问题的思路就是压缩内存成本,是利用哈希思想建立映射的方案可行

位图能解决该问题的大概计算
只粗略计算主干:1 byte 可建立8个数的映射关系(闭散列),那么40亿个数需要 40亿 / (1024 * 1024* 1024 * 8 ) 约等于0.5GB内存。

位图应用总结

  1. 快速查找某个数据是否在一个集合中
  2. 排序 + 去重
  3. 求两个集合的交集、并集等
  4. 操作系统中磁盘块标记(暂时不了解)

位图的模拟实现
注意点:
1.运算符优先级
2.运算逻辑的控制
在.h文件中:

#pragma once
#include<vector>
#include<iostream>
#include<string>
using namespace std;



namespace myBitSet
{
	// 非类型模板参数特化的应用  N的含义为N个bit位的位图
	template<size_t N>
	class bitset
	{
	private:
		 
		//成员变量
		std::vector<char> _bits;

	public:

		bitset()
		{
			// 一个char占8个比特位
			_bits.resize(N / 8 + 1, 0);
		}

		//大概理解为建立映射的功能
		void set(size_t x)
		{
			// x 映射的比特位在第几个char对象
			size_t i = x / 8;

			// x 在char的第几个比特位
			size_t j = x % 8;

			//# 表示可能位0也可能为1
			// 举例j = 3 
			// 原第i个char: ########
			// (1 << j) :   00001000
			//运算结果:     ####1###
			_bits[i] |= (1 << j);
			//注意运算符优先级
		}


		//类似与删除映射的功能
		void reset(size_t x)
		{
			size_t i = x / 8;
			size_t j = x % 8;
			 _bits[i] &= (~(1 << j));
		}

		//查找位是否建立映射的功能
		bool test(size_t x)
		{
			size_t i = x / 8;
			size_t j = x % 8;
			return _bits[i] & (1 << j);
		}

		//测试方案
		void test_can_do()
		{
			bitset<100> bs;
			bs.set(33);
			bs.set(57);

			cout << bs.test(33) << endl;
			cout << bs.test(57) << endl;

			bs.reset(33);

			cout << bs.test(33) << endl;
			cout << bs.test(57) << endl;
		}

	};
}

布隆过滤器(附C++模拟实现源码)

位图的缺点?
只能进行整数的海量数据处理。位图为降低空间损耗,建立的映射方案就是数字N的状态用第N个bit位来标识状态。不再需要区花多余的空间去解决哈希冲突,扩容等问题。
什么是布隆过滤器?
布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间。

布隆过滤器工作原理在这里插入图片描述

布隆过滤器的映射建立与查找

布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特位一定为1。所以可以按照以下方式进行查找:分别计算每个哈希值对应的比特位置存储的是否为零,只要有一个为零,代表该元素一定不在哈希表中,否则可能在哈希表中。
注意:布隆过滤器如果说某个元素不存在时,该元素一定不存在,如果该元素存在时,该元素可能存在,因为有些哈希函数存在一定的误判。

布隆过滤器删除
布隆过滤器不能直接支持删除工作,因为不同元素在建立映射的时候,多个映射位完全相同的概率很小,但存在相同映射位的概率大,在删除一个元素的映射位时,可能会影响其他元素。

布隆过滤器优点

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

布隆过滤器缺陷

  1. 有误判率,即存在假阳性(False Position),即不能准确判断元素是否在集合中(补救方法:再
    建立一个白名单,存储可能会误判的数据)
  2. 不能获取元素本身
  3. 一般情况下不能从布隆过滤器中删除元素
  4. 如果采用计数方式删除,可能会存在计数回绕问题

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

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

相关文章

连续6年霸榜全球工作站市场,Dell Precision凭什么?

前段时间&#xff0c;IDC发布2022 Q4工作站市场报告&#xff0c;戴尔拿下2022年工作站市场出货量和行业占比的双料冠军&#xff0c;且成为全年唯一一家份额增长的供应商。 至此&#xff0c;Dell Precision已连续6年蝉联世界第一。 根据IDC发布的2022年第四季度全球工作站追踪…

第四十章 开发Productions - ObjectScript Productions - 定义企业消息库

文章目录 第四十章 开发Productions - ObjectScript Productions - 定义企业消息库概述定义 Message Bank服务器添加Message Bank Helper类关于Message Bank的注意事项 第四十章 开发Productions - ObjectScript Productions - 定义企业消息库 概述 Enterprise Message Bank …

初识运营,明晰运营的学习路径

关于运营的思考 问题1&#xff1a;运营是什么&#xff1f;运营到底是做什么工作的&#xff1f; 如题&#xff1a;到底什么是运营&#xff1f;为什么我们所接触到的很多运营都不太一样&#xff0c;有的运营就是每天追寻互联网热点&#xff0c;加班加点的写文案&#xff1b;有的…

考研算法32天:桶排 【桶排序】

算法介绍 桶排 举个例子&#xff0c;一个数组中的数是&#xff1a;4 1 2 3 5&#xff0c; 然后桶排的顺序是&#xff1a;将每个数应该在的下标算出来&#xff0c;咋算呢&#xff1f;这我们就得考虑两种情况&#xff1a;假设我们设现在这个需要找到自己在数组里位置的数是x。…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第七章 数据库安全)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、数据库安全概述1、数据库的安全特性 二、数据库中的数据保护2、数据库加密3、数据库完整性保护 三、数据备份与恢复1、数据库备份2、数据库恢复 四、SQL Servre数据库安全…

vue写法——使用js高阶函数实现多条件搜索功能

&#x1f642;博主&#xff1a;爱学习的Akali king &#x1f642;本文核心&#xff1a;vue写法——使用js高阶函数实现多条件搜索功能 目录 类比一下react写法用vue写法来实现&#xff0c;思路步骤&#xff1a;第一步&#xff1a;准备数据第二步&#xff1a;根据数据结构渲染Do…

ModaHub魔搭社区:向量数据库Milvus性能调优教程(一)

目录 性能调优 插入性能调优 查询性能调优 硬件环境 系统参数 性能调优 插入性能调优 “数据插入”到“数据写入磁盘”的基本流程请参考 存储操作。 如果数据量小于单次插入上限&#xff08;256 MB&#xff09;&#xff0c;批量插入比单条插入要高效得多。 系统配置中…

Boom 3D For Win如何进行安装、激活和换机?

Boom系列应用软件又迎来了一位新的“猛将”— 隆重升级的Boom 3D&#xff08;Windows系统&#xff09;&#xff01;这款主打3D环绕音效的软件&#xff0c;既能使用在Windows设备上&#xff0c;也能使用在MAC设备上。Boom 3D既可以让你体验到高质量的3D环绕音效&#xff0c;也能…

我们来谈谈websocket

"你一无所有地闯荡。" 一、初始WebSocket (1) 什么是websocket WebSocket是一种在单个TCP连接上进行全双工通信的协议。 WebSocket使得客户端和服务器之间的数据交换变得更加简单&#xff0c;允许服务端主动向客户端推送数据。在WebSocket API中&#xff0c;浏览器和…

自学黑客(网络安全),一般人我劝你还是算了吧(自学网络安全学习路线--第九章 Internet安全协议)【建议收藏】

文章目录 一、自学网络安全学习的误区和陷阱二、学习网络安全的一些前期准备三、自学网络安全学习路线一、安全协议概述二、IPSec协议1、概述2、IP封装过程3、IPSec不安全性4、IPSec的功能5、IPSec体系结构6、IPSec的AH7、IPSec的AH8、IPSec的ESP9、IPSec的ESP10、ISAKMP11、IK…

分析油烟污染的危害及其控制防治对策 安科瑞 许敏

摘 要&#xff1a;介绍了烹饪油烟的组成及危害&#xff0c;着重概述了家庭烹饪油烟污染特点以及净化技术的研究进展&#xff0c;对各技术特点及存在的问题进行了分析&#xff0c;初步探讨了新近发展的静电催化耦合技术在烹饪排放污染控制中的应用&#xff0c;分析了现行的吸油烟…

全志V3S嵌入式驱动开发(spi-nand image制作和烧入)

【 声明:版权所有,欢迎转载,请勿用于商业用途。 联系信箱:feixiaoxing @163.com】 上一篇文章,我们说到了spi-nor image的制作和输入。相比较spi-nor,spi-nand虽然在稳定性上面差一点,但是价格上面有很大的优势。举例来说,一般32M的spi-nor大约在6-7元左右,但…

软件外包开发在线监控工具

软件系统上线后需要实时监控&#xff0c;这样在系统出现问题后可以及时发现问题并解决问题。今天和大家分享常见的软件系统监控工具&#xff0c;这些工具功能强大且成熟稳定&#xff0c;熟练的应用可以帮助运维人员解决很多项目中的实际问题。北京木奇移动技术有限公司&#xf…

ubuntu dlib 编译 人脸检测

编译&#xff1a; ubuntu14.04 dlib19.2【 C 】Face Landmark Detection_FR-0912的博客-CSDN博客 也可这样 cmake .. -DUSE_AVX_INSTRUCTIONS1 cmake --build .测试代码 linux安装dlib&#xff0c;关键点检测_dlib linux_Peanut_范的博客-CSDN博客 CmakeList.txt cmake_mini…

QtCreator工具下载链接

QT工具下载链接&#xff1a; 离线安装的安装包下载链接&#xff1a; Index of /archive/qthttp://download.qt.io/archive/qt/ 在线安装的安装包下载链接&#xff1a; Index of /archive/online_installershttps://download.qt.io/archive/online_installers/

第八十六天学习记录:Linux基础:基础指令Ⅰ

Linux系统的目录结构 Linux的目录结构是一个树型结构 Linux没有盘符的概念&#xff0c;只有一个根目录/&#xff0c;所有文件都在根目录下面 Linux系统的路径表达形式 在Linux系统中&#xff0c;路径之间的层级关系使用&#xff1a;/来表示。&#xff08;windows系统中用\&a…

ecology9-导出流程上图片附件的方案

ecology9 导出流程上图片附件 方案一方案二√方案三 ecology9 把图片名称位置等信息存储在imagefile中&#xff0c;实际文件以zip压缩包的形式存储在服务器上。需求是提供导出历史流程上的图片附件&#xff0c;方便新系统导入 方案一 编写图片附件下载接口&#xff0c;查询到图…

Java双指针专题——1.移动0 2.复写0 3.快乐数4.盛最多水的容器5.有效三角形的个数 6.和为s的两个数字7.三数之和8.四数之和

目录 1.移动0 2.复写0 3.快乐数 4.盛最多水的容器 5.有效三角形的个数 6.和为s的两个数字 7.三数之和 8.四数之和 1.移动0 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组…

实施预测性维护的策略和实践探讨

随着工业设备复杂性和关键性的增加&#xff0c;传统的计划性维护方法已经无法满足现代工业的需求。预测性维护作为一种基于设备状态和数据分析的维护策略&#xff0c;能够准确预测设备故障&#xff0c;降低停机时间&#xff0c;提高生产效率和设备可靠性。在实施预测性维护之前…

初出茅庐的小李博客之RTC时间设置

串口上位机设置RTC时间进行校准 方式1&#xff1a;发送固定格式时间解析 代码&#xff1a; #include <stdio.h> #include <string.h> /* 当在格式字符串中使用 %*[^:] 时&#xff0c;它表示在读取输入时跳过冒号 : 之前的任何字符。 %*&#xff1a;星号 * 表示读…