位图和布隆过滤器

文章目录

位图

对于海量数据我们如何快速判断一个值是否存在呢?如果使用哈希,红黑树等容器就一定会导致内存不足,因此我们引入了位图的概念。位图中采用一个比特位代表一个值来标记该值是否存在,注意并不是把这个数据存起来,而是只标记它是否存在,例如一个整型int,他就可以表示8个数据是否存在

用第n个位标记数字n是否存在

模拟实现

我们以在整型int中标记为例,在32位机器中一个int类型占据8个bit位

如何将数字n标记为存在?

我们首先要计算数字n在数组中对应的下标,然后在计算出该数字在该数据的第几位。

cpp 复制代码
int i = x / 32;//算出在数组中对应的下标
int n = x % 32;//算出在第几位

Set

将数字n对应的位置置为1

cpp 复制代码
void Set(size_t x)
{
	int i = x / 32;//算出在数组中的哪个位置
	int n = x % 32;//算出在第几位
	_bs[i] |= (1 << n);//将数组中第i个中的第n位置为1
}

Reset

将数字n对应的位置置为0

cpp 复制代码
//将第x位重置为0
void Reset(size_t x)
{
	int i = x / 32;
	int n = x % 32;
	_bs[i] &= ~(1 << n);
}

Test

检验数字n是否存在

cpp 复制代码
//判断第x个比特位数据是否为1
bool Test(size_t x)
{
	int i = x / 32;
	int n = x % 32;
	return _bs[i] & (1 << n);
}

位图应用

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

我们可以将原来一个位表示一个值,改为两个位表示一个值,如果出现两次及两次以上就用11来表示,如果只出现一次就用01表示,除此之外我们也可以设计一个类,类中成员为两个位图,通过两个位图来判断哪个数据出现一次,当n第一次出现时就把位图1第x位设为1,当第二次出现时,检查位图1中该数是否存在如果存在就把位图2也设为1

2、给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?

把这些数据都放入位图1和位图2,然后遍历判断当两个位图中该位置都为1时,就证明该数据为交集,注意位图也有去重的作用

3、位图应用变形:1个文件有100亿个int,1G内存,设计算法找到出现次数不超过2次的所有整数

同问题1,我们把出现1次的数据在位图1和位图2中表示分别为0和1,出现两次在位图1和位图2中表示分别为1和0,出现两次以上在位图1和位图2中表示分别为1和1。

布隆过滤器

位图最大的缺点就是:位图一般只能处理整形,如果内容编号是字符串,就无法处理了,因此我们引入了布隆过滤器,布隆过滤器就是让一个字符串同时去标记在位图中的多个位置,要判断一个字符串是否已经存在就要去判断它在为图中对应的多个位置是否都为1。但是布隆过滤器也有它自己的缺陷,就是可能会出现误判,即以存在的字符串已经把要插入的字符串对应的位置都标记为了1,但是该字符串并不存在,这就会导致误判,此外如果判定要插入的字符串不存在,该字符串它一定是不存在的。

布隆过滤器通过多个映射函数,将某一个字符串标记在位图中的多个位置。

布隆过滤器应用

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

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

哈希切割

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

与上题条件相同,如何找到top K的IP?如何直接用Linux系统命令实现?

相关推荐
库玛西1 小时前
现代 C++ 智能指针全景指南:从 RAII 思想到工业级实践
c语言·开发语言·c++·笔记·面试
liulilittle2 小时前
无锁并发容器的设计与实现原理
开发语言·c++·set·map·并发·无锁·lock-free
qeen873 小时前
【数据结构】自平衡二叉搜索树各种旋转算法原理解析及AVL树的C++实现
数据结构·c++·算法
Augustzero3 小时前
为什么线程不能说睡就睡?看懂等待与唤醒机制
c++·后端
程序员与背包客_CoderZ3 小时前
Linux D-Bus通信协议详解:从入门到C/C++编码实战
linux·服务器·c语言·c++·嵌入式硬件·嵌入式软件·dbus
冻柠檬飞冰走茶3 小时前
PTA基础编程题目集 7-35有理数均值(C++语言实现)
开发语言·数据结构·c++·算法·均值算法
wangchen_03 小时前
C++正则表达式
开发语言·c++·正则表达式
码匠许师傅6 小时前
【C++ 面试真题】聊聊 C++ 中的 lambda 表达式
java·c++·面试
依然鸣6 小时前
PTA团体程序设计天梯赛L1真题讲解L1-085-088
数据结构·c++·经验分享·算法·深度优先·pat考试
沙盘客6 小时前
AFSIM 14篇 C++ 插件开发:扩展你的仿真能力
c++·后端