位图与布隆过滤器

 

目录

一、位图

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.mzph.cn/news/758565.shtml

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

相关文章

netron:本地查看服务器端打开的onnx文件

我们开发一般都在服务器中开发&#xff0c;假如我们在服务器端导出了一个onnx文件&#xff0c;不将onnx文件传到本地&#xff0c;如何进行本地查看呢&#xff1f; netron --port 8082 --host 10.75.29.201 model_data/deeplab_0131.onnx--host : 指定服务器的ip, 注意不是本地…

2024/03/19(网络编程·day5)

一、思维导图 二、selec函数实现TCP并发服务器 #include<myhead.h>#define SER_PORT 8888 //服务器端口号 #define SER_IP "192.168.117.116" //服务器IP int main(int argc, const char *argv[]) {//1、创建一个套接字int sfd -1;sfd socket(AF_INET,SOC…

软件设计师:03 - 数据库系统

一、数据模型的分类 1.1、概念数据模型 1.2、结构数据模型 1.3 真题 二、三级模式 概念模式对应的是基本表&#xff0c;概念模式也称为模式 外模式对应的是视图&#xff0c;也称用户模式或者子模式 内模式对应的是数据库里面的存储文件&#xff0c;也称存储模式 真题 三、两级…

VO、RVO、ORCA(动态避障)算法

碰撞锥&#xff08;碰撞区域&#xff09; 上上图中假设B物体处于静止状态&#xff0c;A物体沿着向量v1和v2移动&#xff0c;刚好能和B擦肩而过&#xff0c;不会发生碰撞&#xff1b;若V1和V2的夹角再小一点的话就一定会发生碰撞。此时会产生碰撞区域&#xff1a; 红线画出来…

蓝桥杯练习04学生成绩统计

学生成绩统计 介绍 随着大数据的发展&#xff0c;数据统计在很多应用中显得不可或缺&#xff0c;echarts作为一款基于JavaScript的数据可视化图表库&#xff0c;也成为了前端开发的必备技能&#xff0c;下面我们一起来用echarts开发一个学生数据统计的柱形图。 准备 开始答…

Vmware使用ubuntu报错空间不够

Vmware使用ubuntu报错空间不够 1.vmware修改2.进入镜像进行修改2.1需要下载GParted软件 1.vmware修改 这个需要把硬盘的大小进行扩展 2.进入镜像进行修改 2.1需要下载GParted软件

C++_回文串

目录 回文子串 最长回文子串 分割回文串 IV 分割回文串 II 最长回文子序列 让字符串成为回文串的最少插入次数 回文子串 647. 回文子串 思路&#xff0c;i j表示改范围内是否为回文串&#xff0c; ②倒着遍历是为了取出dp[i 1][j - 1] ③i j 只有一对&#xff0c;不会重复…

harmonyOS简介及背景

harmonyOS的场景模式18n: 1&#xff08;入口手机&#xff09;8&#xff08;电脑、VR、手环、iPad、智慧屏、&#xff09;–wifi—n(车载、智能家居等所有)harmonyOS不需要考虑软硬件的差异&#xff0c;是一个兼容N种的超级终端harmonyOS干了两件事&#xff1a; &#xff08;1&a…

施工升降机AI数人数识别摄像机

施工现场作为一个复杂的工作环境&#xff0c;在施工过程中通常会有大量的人员出入&#xff0c;为了确保施工安全和管理效率&#xff0c;近年来施工升降机AI数人数识别摄像机应运而生。 这种摄像机依靠先进的人工智能技术和摄像头设备&#xff0c;能够实时监测和识别施工升降机内…

AIGC——ComfyUI工作流搭建、导入与常用工作流下载

工作流 ComfyUI工作流是一个基于图形节点编辑器的工作流程&#xff0c;通过拖拽各种节点到画布上&#xff0c;连接节点之间的关系&#xff0c;构建从加载模型到生成图像的流程。每个节点代表一个与Stable Diffusion相关的模型或功能&#xff0c;节点之间通过连线传递图片信息。…

2390.从字符串中移除星号

题目&#xff1a;给你一个包含若干星号 * 的字符串 s 。 在一步操作中&#xff0c;你可以&#xff1a; 选中 s 中的一个星号。移除星号 左侧 最近的那个 非星号 字符&#xff0c;并移除该星号自身。 返回移除 所有 星号之后的字符串。 注意&#xff1a; 生成的输入保证总是…

如何对静态IP进行测试?静态IP有什么优点?

随着互联网的普及&#xff0c;越来越多的人开始使用动态IP进行上网。但是在某些情况下&#xff0c;我们可能需要使用静态IP进行测试或特定的网络设置。本文将介绍如何获取静态IP进行测试以及静态IP的优点。 一、如何获取静态IP进行测试&#xff1f; 1.联系ISP&#xff08;Int…

【JS】数组查重

码 /*** 数组查重* param {Array} arr 查重的数组* returns Array 返回不重复的数组 */ const noReArr arr > [...new Set(arr)]const a [12,12,3,4] console.log( noReArr(a) );效果图

031—pandas 读取解析实验室数据至DataFrame

前言 某个科研实验室在进行一项物理实现&#xff0c;实验仪器会输出一个 txt 文本的数据&#xff0c;研究人员需要从这个文本中将数据结构化才能进行进行统计分析。 在为个解析和分析过程中&#xff0c;他们选择了 Python 的 pandas 库来完成这些操作。我们今天来完成这这个 t…

使用AOP拦截全局请求并校验请求参数

天行健&#xff0c;君子以自强不息&#xff1b;地势坤&#xff0c;君子以厚德载物。 每个人都有惰性&#xff0c;但不断学习是好好生活的根本&#xff0c;共勉&#xff01; 文章均为学习整理笔记&#xff0c;分享记录为主&#xff0c;如有错误请指正&#xff0c;共同学习进步。…

【数据结构】猛猛干11道链表OJ(未完待续ing)

前言知识点 链表的调试技巧 int main() {struct ListNode* n1(struct ListNode*)malloc(sizeof(struct ListNode));assert(n1);struct ListNode* n2(struct ListNode*)malloc(sizeof(struct ListNode));assert(n2);struct ListNode* n3(struct ListNode*)malloc(sizeof(struc…

蓝桥杯 2023 省B 飞机降落

首先&#xff0c;这题要求的数据量比较少&#xff0c;我们可以考虑考虑暴力解法。 这题可能难在很多情况的考虑&#xff0c;比如说&#xff1a; 现在时间是10&#xff0c;有个飞机20才到&#xff0c;我们是可以干等10分钟。 #include <iostream> #include <…

对话奇酷网络董事长吴渔夫: 迟到的游戏公司会被AI浪潮卷入海底

“ 迟到的游戏公司会被无形的 AI 浪潮卷入海底。” 整理 | 梦婕 编辑 | 云舒 出品&#xff5c;极新 2024年3月4日&#xff0c;在极新与吴渔夫的对话中&#xff0c;吴渔夫多次呼吁“全力拥抱AI”。在这场AI浪潮中&#xff0c;作为中国网游的先锋&#xff0c;他带着 25 年“中…

【web前端】<meta>标签

meta元素可以提供有关页面的元信息&#xff08;meta-information&#xff09; meta标签位于文档的头部&#xff0c;是空元素 meta元素的属性 属性值描述http-equiv expires refresh X-UA-compatible 定义HTTP协议的头部元信息名称。其中&#xff0c;expires设置网页在缓存区的…

记录一下目前为止的算法成长

每日笔记 复习曲线 间隔1天、3天、7天、15天、30天&#xff0c;然后以一个月为周期复习 2023. 12. 24 一定要每天早中晚都要复习一下 早中午每段一两道, 而且一定要是同一个类型, 不然刷起来都没有意义 11.29 开始向着面试刷题跟进! 每天刷4题左右 ,一周之内一定要是统一类…