当前位置: 首页 > news >正文

C++位图(Bitmap)与布隆过滤器(Bloom Filter)详解及海量数据处理应用

目录

一、位图

1. 基本概念

2.位图三大核心内容

(1).置1

(2).置0

(3).判断在不在

  (4)以上代码的总代码

二、布隆过滤器

1. 基本原理

2.原理

(1)插入

(2)查找

(3)删除

三、海量数据处理

1、哈希切分

2、面试题

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

​编辑

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

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

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

​编辑

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


一、位图

1. 基本概念

位图是一种使用bit位来存储数据状态的紧凑数据结构,每个bit位代表一个元素是否存在

我们以int来举例!!!,一个int有4个字节,一个字节有8个比特位,我们可以用一个比特位来映射一个值,比特位上的1或0来表示该数值在不在,1表示该数值在,0则表示该数值不在

怎么知道映射的位置在哪呢?

我们用一个int的数组_set来储,一个int数组有32个比特位,怎么知道数值为pos值的位置在哪呢?

int x=pos/32,得出pos位于_set[x]中

int y=pos%32,得出pos位于_set[x]中的第几位

2.位图三大核心内容

(1)置1

代码:

//1.第x位设置为1
void set(size_t x)
{//32是in有4个字节,然后一个字节=8个比特size_t i = x / 32;size_t j = x % 32;//这个~是位的取反_a[i] |= (1 << j);
}
(2)置0

代码:

//2.第x位设置为0
void reset(size_t x)
{//32是in有4个字节,然后一个字节=8个比特size_t i = x / 32;size_t j = x % 32;//这个~是位的取反_a[i] &= ~(1 << j);
}
(3)判断在不在

代码:

//3.检查第x位是否为1
bool test(size_t x)
{//判断这个位在不在size_t i = x / 32;size_t j = x % 32;//这个~是位的取反return 	_a[i] & (1 << j);
}

  (4)以上代码的总代码

namespace tyx
{template<size_t N>class bitset{public:bitset(){_a.resize(N / 32 + 1);}//1.第x位设置为1void set(size_t x){//32是in有4个字节,然后一个字节=8个比特size_t i = x / 32;size_t j = x % 32;//这个~是位的取反_a[i] |= (1 << j);}//2.第x位设置为0void reset(size_t x){//32是in有4个字节,然后一个字节=8个比特size_t i = x / 32;size_t j = x % 32;//这个~是位的取反_a[i] &= ~(1 << j);}//3.检查第x位是否为1bool test(size_t x){//判断这个位在不在size_t i = x / 32;size_t j = x % 32;//这个~是位的取反return 	_a[i] & (1 << j);}private:vector<int> _a;};};

二、布隆过滤器

1. 基本原理

布隆过滤器是位图的扩展,使用多个哈希函数来减少冲突概率。

2.原理

(1)插入

(2)查找

布隆过滤器是将哈希函数的哈希值映射到一个位图中,因此映射到的位图的位置一定为1,根据该值所有哈希函数映射到的位置是否全为1来(粗略)判断该值在不在,如果不是全为1(含0),那么这个值一定是不存在的,如果全为1那也不一定存在,以为其他的值的哈希函数也有可能映射到相同的位置,造成误判所以我们需要进入数据库进一步判断(这就体现了布隆过滤器的作用:减缓了数据库的压力)

(3)删除

计数布隆过滤器(简略概述)

在映射的位置进行计数,映射一次就++,删除的时候就--,当值为0的时候就被删除掉了

三、海量数据处理

1、哈希切分

将一个文件切成n个,如果要在多个文件中寻找相交集的query,直接找从相同序号的小文件里找,而不要全部去遍历,节省了空间

2、面试题

(1)给一个超过100G大小的logfile,log中存着IP地址,设计算法找到出现次数最多的IP地址/出现最多的K个地址?
(2)给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法

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

大致思路: 先准备好两个位图 bitset1 bitset2 ,然后出现0次 bitset1和bitset2的值为0,出现1次的让bitset1的值为0 bitset2的值为1     ,出现两次及以上则让 bitser1的值为1,bitset2的值为1


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

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

http://www.lryc.cn/news/613052.html

相关文章:

  • vue3父组件把一个对象整体传入子组件,还是把一个对象的多个属性分成多个参数传入
  • C#中统计某个字符出现次数的最简单方法
  • Git `cherry-pick` 工具汇总
  • Numpy科学计算与数据分析:Numpy线性代数基础与实践
  • 第一个vue应用
  • 【Kubernetes】部署 kube-bench 实现 K8s 最佳实践
  • LeetCode 分类刷题:125. 验证回文串
  • LongVie突破超长视频生成极限:1分钟电影级丝滑视频,双模态控制告别卡顿退化
  • Postman接口测试入门
  • ESXI7.0添加标准交换机过程
  • Python 位置参数(positional arguments)
  • 大文件断点续传(vue+springboot+mysql)
  • 8.结构健康监测选自动化:实时数据 + 智能分析,远超人工
  • Python 基础详解:变量(Variables)—— 程序的“记忆单元”
  • Numpy科学计算与数据分析:Numpy数据分析基础之统计函数应用
  • 理清C语言中动态内存管理相关函数
  • 思科设备密码恢复方法
  • 使用Puppeteer轻松自动化浏览器操作
  • Axure安装教程(附安装包)Axure RP 10下载详细安装图文教程
  • 用LaTeX优化FPGA开发:结合符号计算与Vivado工具链
  • C++高频知识点(十五)
  • 解决chrome下载crx文件被自动删除,加载未打包的扩展程序时提示“无法安装扩展程序,因为它使用了不受支持的清单版本解决方案”
  • 《算法导论》第 10 章 - 基本数据结构
  • 深入探索C++模板实现的单例模式:通用与线程安全的完美结合
  • 小程序省市级联组件使用
  • Linux机器可直接使用的自动化编译文件
  • [论文阅读] 人工智能 + 软件工程 | 大型语言模型与静态代码分析工具:漏洞检测能力大比拼
  • 专题:2025财务转型与AI赋能数字化报告|附30+份报告PDF汇总下载
  • 计算机视觉第一课opencv(一)保姆级教学
  • 水下管道巡检机器人cad【10张】三维图+设计说明书