位图与布隆过滤器

 

目录

一、位图

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的次数多于位数所能表达的最大值,就会出现回绕问题(类似于数据单位溢出)

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【阅读论文】When Large Language Models Meet Vector Databases: A Survey

摘要 本调查探讨了大型语言模型&#xff08;LLM&#xff09;和向量数据库&#xff08;VecDB&#xff09;之间的协同潜力&#xff0c;这是一个新兴但迅速发展的研究领域。随着LLM的广泛应用&#xff0c;出现了许多挑战&#xff0c;包括产生虚构内容、知识过时、商业应用成本高昂…

day01_mysql_课后练习 - 参考答案

文章目录 day01_mysql_课后练习第1题第2题第3题第4题第5题 day01_mysql_课后练习 第1题 案例&#xff1a; 1、创建数据库day01_test01_library 2、创建表格books 字段名字段说明数据类型允许为空唯一b_id书编号int(11)否是b_name书名varchar&#xff08;50&#xff09;否否…

章节10实验--Ubuntu18.04 Qt MySQL libqsqlmysql.so

前言: 内容参考《操作系统实践-基于Linux应用与内核编程》一书的示例代码和教材内容&#xff0c;所做的读书笔记。本文记录再这里按照书中示例做一遍代码编程实践加深对操作系统的理解。 引用: 《操作系统实践-基于Linux应用与内核编程》 作者&#xff1a;房胜、李旭健、黄…

SAP SD模块影响MRP结果的几个因素

后台最近会收到小伙伴的私信说,我的销售订单已经下达了,但是MRP仍然没有跑出结果,没有跑出需求。遇到这种情况我们就需要一个个地方去进行分析,看哪里的数据存在问题,系统的配置存在问题导致的。接下来文章中将会分析SD销售模块哪些配置点会影响到MRP的运行。 1、首先遇到…

【Web】浅聊Hessian异常toString姿势学习复现

目录 前言 利用关键 调用分析 如何控制第一个字节 EXP 前言 Hessian CVE-2021-43297&#xff0c;本质是字符串和对象拼接导致隐式触发了该对象的 toString 方法&#xff0c;触发toString方法便可生万物&#xff0c;而后打法无穷也&#xff01; 这个CVE针对的是Hessian2I…

5G智能网关助力工业铸造设备监测升级

随着物联网技术的迅猛发展和工业4.0浪潮的推进&#xff0c;传统工业正面临着严峻的转型升级压力。在这一背景下&#xff0c;铸造行业——这一典型的传统重工业领域&#xff0c;也必须积极探索借助5G、物联网、边缘计算等技术提升生产经营效率的新路径。 本文就基于佰马合作伙伴…

C++初阶 | [九] list 及 其模拟实现

摘要&#xff1a;介绍 list 容器&#xff0c;list 模拟实现&#xff0c;list与vector的对比 list&#xff08;带头双向循环列表&#xff09; 导入&#xff1a;list 的成员函数基本上与 vector 类似&#xff0c;具体内容可以查看相关文档(cplusplus.com/reference/list/list/)&…

美食杂志制作秘籍:引领潮流,引领味蕾

美食杂志是一种介绍美食文化、烹饪技巧和美食体验的杂志&#xff0c;通过精美的图片和生动的文字&#xff0c;向读者展示各种美食的魅力。那么&#xff0c;如何制作一本既美观又实用的美食杂志呢&#xff1f; 首先&#xff0c;你需要选择一款适合你的制作软件。比如FLBOOK在线制…

网络电视盒子哪个品牌好?2024畅销电视盒子排行榜

电视盒子的品牌和产品非常多&#xff0c;让新手在选购时难度增大&#xff0c;大部分消费者在此时会选择参考销量排名情况&#xff0c;小编这次结合各个电商平台的销量和用户评价整理了电视盒子排行榜&#xff0c;想买电视盒子不知道网络电视盒子哪个品牌好可以收藏。 TOP 1.泰捷…

Model-Free Optimal Tracking Control via Critic-Only Q-Learning

Model-Free Optimal Tracking Control via Critic-Only Q-Learning Biao Luo, Member, IEEE, 2016&#xff0c;Derong Liu, Fellow, IEEE, Tingwen Huang, and Ding Wang, Member, IEEE 对非仿射非线性离散时间系统&#xff0c;提出model-free最优跟踪控制问题。仅有评价网络的…

算法刷题Day14 | 二叉树理论、递归遍历、迭代遍历、统一迭代

目录 0 引言1 递归遍历1.1 前序遍历1.2 后序遍历1.3 中序遍历 2 迭代遍历2.1 前序和后序2.2 中序 &#x1f64b;‍♂️ 作者&#xff1a;海码007&#x1f4dc; 专栏&#xff1a;算法专栏&#x1f4a5; 标题&#xff1a;算法刷题Day14 | 二叉树理论、递归遍历、迭代遍历、统一迭…

[Linux_IMX6ULL应用开发]-Makefile

目录 Makefile的规则 Makefile的语法 通配符 假想目标 变量 Makefile的函数 foreach函数 filter和filter-out wildcard patsubst 修改头文件无法make解决 CFLAGS Makefile的规则 当我们在使用gcc进行编译链接的时候&#xff0c;我们需要手动在shell窗口键入命令。比…

大模型“说胡话”现象辨析

在人工智能快速发展的今天&#xff0c;大型深度学习模型已成为自然语言处理领域的核心力量。然而&#xff0c;随着这些模型规模的不断扩大和功能的日益增强&#xff0c;一种被称为“说胡话”的现象也愈发引人关注。这种现象不仅影响了模型在实际应用中的效果&#xff0c;也引发…

Linux入门-常见指令及权限理解

目录 1、Linux背景 1.1、发展历史 1.2、开源 1.3Linux企业应用现状 2、Linux下的基本命令 2.1、ls 指令 2.2、pwd 命令 2.3、cd 命令 2.4、touch命令 2.5、mkdir 命令 2.6、rmdir 指令和 rm指令 2.7 man 指令 2.8、cp指令 2.9、mv 指令 2.10 cat 2.11 more 2…

RocketMq 顺序消费、分区消息、延迟发送消息、Topic、tag分类 实战 (消费者) (三)

消费端配置 如下所示&#xff1a;是消费者的配置类&#xff0c;有以下几点需要注意的地方 1、是TargetMessageListener这个监听类&#xff08;下文会把这个监听类的具体代码贴出来&#xff09;&#xff0c;需要把这个监听类订阅。 2、rocketMqDcProperties.getTargetProperties…

MySQL 多表查询与事务的操作

一,多表联查 有些数据我们已经拆分成多个表,他们之间通过外键进行连接.当我们要查询两个表的数据,各取其中的一列或者多列. 这时候就需要使用多表联查. 数据准备: # 创建部门表 create table dept(id int primary key auto_increment,name varchar(20) ) insert into dept (n…

力扣---打家劫舍---动态规划

思路 1&#xff1a; 我将res[i]定义为&#xff1a;一定要取第 i 个房子的前提下&#xff0c;能获取的最大金额。那么直接用cnt从头记录到尾&#xff0c;每个房子的res最大值即是答案。那么递推公式是什么&#xff1f;res[i]max(res[i-2],res[i-1],...,res[0])nums[i]。数组初始…

cmake与交叉编译(x86 to arm)过程和问题全记录

一、背景 公司维护一批c动态库&#xff0c;由于生产需要&#xff0c;每次更新都要在windows、linux_x86、kylin_arm等多个环境中编译一遍&#xff0c;操作比较麻烦&#xff0c;所以想通过交叉编译的方式在一台机器上边编译多个环境的动态库&#xff0c;减少工作量。考虑到工作…

浅谈大模型“幻觉”问题

大模型的幻觉大概来源于算法对于数据处理的混乱&#xff0c;它不像人类一样可以by the book&#xff0c;它没有一个权威的对照数据源。 什么是大模型幻觉 大模型的幻觉&#xff08;Hallucination&#xff09;是指当人工智能模型生成的内容与提供的源内容不符或没有意义的现象。…

Linux——程序地址空间

我们先来看这样一段代码&#xff1a; #include <stdio.h> #include <unistd.h> #include <stdlib.h>int g_val 0;int main() {pid_t id fork();if(id < 0){perror("fork");return 0;}else if(id 0){ //child,子进程肯定先跑完&#xff0c;也…