位图与布隆过滤器

news2024/11/25 0:42:51

 

目录

一、位图

1、问题用位图来解决:

二、 布隆过滤器

       1、将哈希与位图结合,即布隆过滤器

2.布隆过滤器的查找

3.布隆过滤器的删除

4.布隆过滤器优点

5、布隆过滤器缺陷 

三、海量数据处理问题:


一、位图

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

  •         遍历一遍,时间复杂度O(n)
  •         排序,然后二分查找,时间复杂度O(n*log2n)
  •         使用位图,使用一个bit来存储对象存在或不存在的信息。

例如:

        位图的概念:用一个bit位的数据存放某种状态信息,应用于:海量数据且无重复的场景,通常用来判断一个数据是否存在。

1、问题用位图来解决:

        首先:40亿个数据,用hash、遍历或者排序的方法,内存开销会16GB,但是使用位图,开销只有0.5GB。

        位图结构:无符号整数的范围是:0~2^32-1,所有无符号整数的范围(种类)为42亿9千万(2^32)左右,我们使用位图,位图的每一位对应与一个无符号整数的种类,一共需要2^32bit=0.5GB。位图结构:使用vector<int>构造

 对40亿个数据遍历一边,将位图中的映射位置为1.然后x找到映射位,为0或者1,来判断数据是否存在。

问题解决算法代码:

bool find(vector<int> arr, size_t x) {
	bitset<(size_t)-1> set1;
	for (int& val : arr) {
		set1.set(val);
	}
	
	return set1.test(x);
}

 位图结构代码:

核心解析:

size_t i = x / 32;

找到x在位图中位于第几个int中, 

size_t j = x % 32;

 确定x在确定的int类型中32位的那个bit位映射  

_a[i] |= (1<<j);

利用按位或,0与任意或等于任意,1与任意或等于1。将j位改为1.

class bitset
{

public:
	bitset() {
		:_bit.resize((N >> 5) + 1);//>>5,相当于÷32,如果存在余数,需要+1
		_bitCount(N)
	}

	void set(size_t x) {
		size_t i = x / 32;//x的映射bit位于位图中的第i个int中,
		size_t j = x % 32;//x的映射bit位于第i个int中的第j个位
		
		_a[i] |= (1<<j);//按位与,仅在j位有1,其余位为0,仅改变j位
	}

	void reset(size_t x) {
		size_t i = x / 32;
		size_t j = x % 32;
		_a[i] & = (~(1 << j));
	}

	bool test(size_t x){
		size_t i = x / 32;
		size_t j = x % 32;
		return _a[i] & (1 << j);
	}

private:
	vector<int> _bit;
	size_t _bitCount;
};

 补充:1位只能存储2种状态,2位可存储4种状态。我们可以使用两位来标记一个整形的状态,但是通常使用两个位图来时实现更加方便。

位图的应用:

1. 快速查找某个数据是否在一个集合中

2. 排序 + 去重

3. 求两个集合的交集、并集等

4. 操作系统中磁盘块标记

二、 布隆过滤器

        我们浏览新闻时,app推送的新闻不会是你曾经看过的,它每次推荐时要去重,去掉那些已经看过的内容。使用hash浪费内存空间,使用位图只能处理整数。

       1、将哈希与位图结合,即布隆过滤器

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

        结构和原理如下

2.布隆过滤器的查找

         布隆过滤器的思想是将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特位一定为1。

所以可以按照以下方式进行查找:分别计算每个哈希值对应的比特位置存储的是否为零,只要有一个为零,代表该元素一定不在哈希表中,否则可能在哈希表中。

注意:布隆过滤器如果说某个元素不存在时,该元素一定不存在,如果该元素存在时,该元素可 能存在,因为有些哈希函数存在一定的误判。

比如:在布隆过滤器中查找"alibaba"时,假设3个哈希函数计算的哈希值为:1、3、7,刚好和其 他元素的比特位重叠,此时布隆过滤器告诉该元素存在,但实该元素是不存在的。

3.布隆过滤器的删除

 布隆过滤器不能直接支持删除工作,因为在删除一个元素时,可能会影响其他元素。 比如:删除上图中"tencent"元素,如果直接将该元素所对应的二进制比特位置0,“baidu”元素也 被删除了,因为这两个元素在多个哈希函数计算出的比特位上刚好有重叠。

一种支持删除的方法:将布隆过滤器中的每个比特位扩展成一个小的计数器,插入元素时给k个计 数器(k个哈希函数计算出的哈希地址)加一,删除元素时,给k个计数器减一,通过多占用几倍存储 空间的代价来增加删除操作。

缺陷: 1. 无法确认元素是否真正在布隆过滤器中

2. 存在计数回绕:溢出所有位的最大值,然后判断为错误值

4.布隆过滤器优点

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

5、布隆过滤器缺陷 

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

三、海量数据处理问题:

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

 与上题条件相同,如何找到top K的IP?

如何直接用Linux系统命令实现?

答案:第一步:我们首先使用hash切割,将100g个文件切割成200个小文件,平均每个小文件0.5g,相同ip地址的log会分配到同一个小文件下。

第二步:依次对每个小文件遍历,将log文件的IP地址放进hash表中,hash表中存储log的ip地址和个数,用max记录次数最多的那个数。遍历所有小文件后,返回max,即是最多的ip地址个数。

注意事项:如果在hash分割大文件的时候,有的小文件若比较大,①放进map中发生大量冲突,则可以对小文件换一个新的hash函数再次细分。②放进map中大量相同,则可以读入map。

 1. 给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出 精确算法和近似算法

答案:100亿=10^10=10G左右,假设query为10byte,所以大文件为100GB,命名为A和B

        第一步,同上,对两个文件各自进行hash分割为200个小文件,分别为A1~A200,以及B~B200,A1和B1采样相同的hash函数,那么两个大文件的同一个query,必然在哈希函数相同小文件中。

        第二步:将对应的小文件(A1和B1),即hash分割时hash函数相同的小文件,一起放进set中,过滤掉重复和不相同的元素,每次处理完将set中的元素存入对应的文件,依次对A2,B2~A200,B200进行相同处理。

注意:若set中存在大量冲突,可以抛异常,将文件再次细分。

 3. 如何扩展BloomFilter使得它支持删除元素的操作

        采用多个位来记录一个hash函数的映射,这里的多个位可以是多个位图(建议),也可以是一个位图采用多个位。我们每次加入一个元素后,多个hash函数对应的各自的多个位都+1,每次删除一个元素后,同理减一。

注意事项:当hash函数对应的多个位,加1的次数多于位数所能表达的最大值,就会出现回绕问题(类似于数据单位溢出)

 

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

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

相关文章

【C++】详解 INT_MAX 和 INT_MIN(INT_MAX 和 INT_MIN是什么?它们的用途是什么?如何防止溢出?)

目录 一、前言 二、什么是 INT_MAX 和 INT_MIN &#xff1f; 三、INT_MAX 和 INT_MIN 的用途 四、如何避免溢出问题出现 &#xff1f; 五、 INT_MAX 和 INT_MIN 的运算 六、leetcode 常考面试题 七、共勉 一、前言 大家在平时刷 leetcode 的时候&#xff0c;肯定会碰到 溢出…

谷歌seo网络营销哪家好?

对于一个好的服务商的评判标准其实不难&#xff0c;保证结果&#xff0c;服务透明化&#xff0c;专业的服务&#xff0c;专业的指导&#xff0c;但怕就怕在你什么都不懂&#xff0c;只看重短期的结果&#xff0c;不懂谷歌seo的基础 一些做谷歌seo的反面例子也是需要了解的&…

上位机图像处理和嵌入式模块部署(qmacvisual三维测量)

【 声明&#xff1a;版权所有&#xff0c;欢迎转载&#xff0c;请勿用于商业用途。 联系信箱&#xff1a;feixiaoxing 163.com】 在qmacvisual软件里面&#xff0c;关于三维测量方面的内容讲的比较少。目前来说只有一个插件完成这个功能。这可能也和作者自己当时的开发环境有关…

springcloud-Nacos 更强大的注册中心组件

Nacos 实际上从设计思想来说 Eureka 和 nacos 是一样的。 后者是Alibaba推出的 一款更强大 功能更丰富的注册中心 你可以理解为Eureka的高配版 技多不压身既然了解了 Eureka, nacos也来学习一下吧&#xff01; 安装 首先nacos不像eureka 直接pom里面引个依赖就搞定了&#…

查看angular版本的问题The Angular CLI requires a minimum Node.js version of v18.13.

angular版本与node.js版本不匹配的问题 下载安装angular 查看版本&#xff0c;发现不匹配 安装指定版本即可 查看版本并运行

diandian数据聚合平台参数分析(水)

diandian数据聚合平台参数分析&#xff08;水&#xff09; 链接地址&#xff1a;‘暂无’&#xff08;懂的都懂&#xff09; 1. 打开网页链接&#xff0c;f12 打开控制台&#xff0c;任意搜索。 2 经过对比分析 需要分析参数key 3 通过debugger分析回溯 发现以下参数生成位置 …

许战海战略文库|向宗老致敬!祝娃哈哈未来三十年行稳致远

摘要&#xff1a;许战海咨询对宗老先生的崇高敬意与对民族品牌的坚定支持,许战海咨询运用其独特的战略视角深入剖析产品战略&#xff0c;旨在帮助娃哈哈有效利用自身的竞争优势,打造爆品,实现进一步的高速增长。 娃哈哈品牌当前所面临的种种挑战,其根源在于缺乏明确和有力的主…

智慧公厕:卫生、便捷、安全的新时代厕所变革

在城市快速发展的背景下&#xff0c;公共厕所的建设和管理变得越来越重要。智慧公厕作为厕所变革的一项全新举措&#xff0c;通过建立公共厕所全面感知监测系统&#xff0c;以物联网、互联网、大数据、云计算、自动化控制技术为支撑&#xff0c;实现对公共厕所的智能化管理和运…

论文阅读之AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE

文章目录 原文链接主要内容模型图技术细节实验结果 原文链接 AN IMAGE IS WORTH 16X16 WORDS: TRANSFORMERS FOR IMAGE RECOGNITION AT SCALE 主要内容 这篇文章的主要内容是介绍了一种新的计算机视觉模型——Vision Transformer&#xff08;ViT&#xff09;&#xff0c;这是…

机器之心 | 基于DiT,支持4K图像生成,华为诺亚0.6B文生图模型PixArt-Σ来了

本文来源公众号“机器之心”&#xff0c;仅用于学术分享&#xff0c;侵权删&#xff0c;干货满满。 原文链接&#xff1a;基于DiT&#xff0c;支持4K图像生成&#xff0c;华为诺亚0.6B文生图模型PixArt-Σ来了 这个模型和 Sora 一样采用了 DiT 框架。 1 前言 众所周知&#x…

latex如何让标题section取消数字标号

解决方法——加一个*号 在LaTeX中&#xff0c;如果你想让section标题取消数字标号&#xff0c;可以使用section*代替section。section*将生成一个不带数字标号的节标题。 例如&#xff0c;你可以这样写&#xff1a; \section*{这是不带数字标号的节标题}这将生成一个标题&am…

protobuf原理解析-基于protobuf-c实现序列化,反向序列化

1.一个实例 前面介绍了使用protobuf的流程&#xff0e; (1). 定义proto文件来描述需要序列化和反向序列化传输的消息&#xff0e; (2). 借助proto-c&#xff0c;为proto文件生成对应的代码控制文件&#xff0e; (3). 程序借助生成的代码控制文件和protobuf-c动态库的支持实现类…

【C语言】数组结构体枚举联合详解

主页&#xff1a;醋溜马桶圈-CSDN博客 专栏&#xff1a;C语言_醋溜马桶圈的博客-CSDN博客 gitee&#xff1a;mnxcc (mnxcc) - Gitee.com 目录 1.数据在内存中的存储 1.1 数据类型 1.2 整型在内存中的存储 1.2.1原码、反码、补码 1.2.2 大小端介绍 1.2.2.1 什么是大端小端 …

生骨肉冻干喂养有哪些优点?对猫身体好的生骨肉冻干分享

随着科学养猫知识的普及&#xff0c;生骨肉冻干喂养越来越受到养猫人的青睐。生骨肉冻干不仅符合猫咪的饮食天性&#xff0c;还能提供均衡的营养&#xff0c;有助于维护猫咪的口腔和消化系统健康。很多铲屎官看到了生骨肉冻干喂养的好处&#xff0c;打算开始生骨肉冻干喂养&…

module ‘mpmath‘ has no attribute ‘rational‘ 报错解决

**报错&#xff1a;**AttributeError: module ‘mpmath’ has no attribute ‘rational’ 解决&#xff1a; pip install mpmath1.3.0原因&#xff1a; 最新版本的mpmath有变动&#xff0c;直接使用旧版本即可

【virtio-networking 和 vhost-net 简介】

文章目录 Virtio 基本构建块Virtio spec 和 vhost 协议Vhost-net/virtio-net architectureVirtio-networking and OVS总结参考链接 Virtio 是作为虚拟机 (VM)访问简化device&#xff08;如块设备和网络适配器&#xff09;的 标准化开放接口而开发的。Virtio-net是一种虚拟以太…

some/ip CAN CANFD

关于SOME/IP的理解 在CAN总线的车载网络中&#xff0c;通信过程是面向信号的 当ECU的信号的值发生了改变&#xff0c;或者发送周期到了&#xff0c;就会发送消息&#xff0c;而不考虑接收者是否需要&#xff0c;这样就会造成总线上出现不必要的信息&#xff0c;占用了带宽 …

基于 Vue3打造前台+中台通用提效解决方案(中)

33、实现全屏展示功能 我们知道在原生dom上,提供了一些方法来供我们开启或关闭全屏: Element.requestFullscreen()Document.exitFullscreen()Document.fullscreenDocument.fullscreenElement一般浏览器 使用requestFullscreen()和exitFullscreen()来实现 早期版本Chrome浏…

基于python的4s店客户管理系统

技术&#xff1a;pythonmysqlvue 一、背景 进入21世纪网络和计算机得到了飞速发展&#xff0c;并和生活进行了紧密的结合。目前&#xff0c;网络的运行速度以达到了千兆&#xff0c;覆盖范围更是深入到生活中的角角落落。这就促使管理系统的发展。网上办公可以实现远程处理事务…

NetSuite Saved Search-当前库存快照查询报表

最近&#xff0c;在项目上我们遇到了一个需求是&#xff0c;用户想要在一张报表上&#xff0c;看到某一个仓库中批次物料和非批次物料的库存On Hand信息。 其实&#xff0c;系统也有一张原生的库存当前快照报表&#xff0c;但是由于批次物料会涉及太多的批次信息&#xff0c;因…