位图和布隆过滤器(C++)

news2024/9/23 9:33:37

位图和布隆过滤器

  • 一、位图
    • 1. 引入
    • 2. 概念
    • 3. 代码实现
      • set
      • reset
      • 完整代码
    • 4. 位图的应用
  • 二、布隆过滤器
    • 1. 引入
    • 2. 概念
    • 3. 逻辑结构
    • 4. 特点
    • 5. 代码实现
    • 6. 布隆过滤器的应用
  • 三、哈希切割

一、位图

1. 引入

当面对海量数据需要处理时,内存不足以加载这些数据,这时普通的方法就不适用了。如果在这海量的数据是否存在,那么只判断状态只需要一个bit位即可,0就是不存在,1就是存在。

2. 概念

每一位都用来存放某种状态,适用于海量的数据,数据无重复的场景。通常是判断某个数据是否存在。

3. 代码实现

位操作

  1. |
    1 | 0 = 1
    1 | 1 = 1
    0 | 1 = 1
    0 | 0 = 0
  2. &
    1 & 0 = 0
    1 & 1 = 1
    0 & 1 = 0
    0 & 0 = 0

set

set运算

//把x映射的位置设为1
void set(size_t x)
{
	int i = x / 32;
	int j = x % 32;
	_a[i] |= (1 << j);
}

reset

reset位运算

//把x映射的位置设为0
void reset(size_t x)
{
	int i = x / 32;
	int j = x % 32;
	_a[i] &= ~(1 << j);
}

完整代码

namespace kpl
{
	template<size_t N>
	class bitset
	{
	public:
		bitset()
		{
			_a.resize(N / 32 + 1);
		}

		//把x映射的位置设为1
		void set(size_t x)
		{
			int i = x / 32;
			int j = x % 32;
			_a[i] |= (1 << j);
		}

		//把x映射的位置设为0
		void reset(size_t x)
		{
			int i = x / 32;
			int j = x % 32;
			_a[i] &= ~(1 << j);
		}

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


	private:
		vector<int> _a;
	};
}

4. 位图的应用

问题1:给定100亿个整数,计算只出现一次的数
问题2:找出现次数超过两次的所以整数
解答:可以使用两个位图控制,或者一个位图两个标志位控制

两个位图代码的实现:

namespace kpl
{
template<size_t N>
	class twobitset
	{
	public:

		//把x映射的位置设为1
		void set(size_t x)
		{
			//00  -->   01
			if (!_bs1.test(x) && !_bs2.test(x))
			{
				_bs2.set(x);
			}
			//01  -->   10
			else if (!_bs1.test(x) && _bs2.test(x))
			{
				_bs1.set(x);
				_bs2.reset(x);
			}
		}

		bool is_one(size_t x)
		{
			return !_bs1.test(x) && _bs2.test(x);
		}

	private:
		bitset<N> _bs1;
		bitset<N> _bs2;
	};
}

二、布隆过滤器

1. 引入

客户端推荐新内容,每次推荐要过滤掉已经存在的历史记录。如果使用哈希表,太浪费空间。单独使用位图又不能除了字符串。
所以采用位图和哈希结合的方法即布隆过滤器。

2. 概念

布隆过滤器是一种概率性数据结构,使用多个哈希函数,将一个数据用多个哈希函数映射到一个位图结构中,因此被映射的位置的比特位一定为1。

  1. 查找
    分别计算每个哈希值对应的比特位存储是否为0,只要一个为0,则该元素一定不存在,否则可能存在在哈希表中(布隆过滤器对存在有误判)
  2. 删除
    不能直接支持删除工作,因为可能会影响其他的元素
    可以通过计数器来增加这一删除操作,但是会增加几倍的存储空间,同时因为不确定该元素是否存在,可能会误删。

3. 逻辑结构

布隆过滤器

4. 特点

优点:

  1. 增加和查询元素的时间复杂度为O(K)(K为哈希函数的个数)
  2. 哈希函数相互之间没有关系
  3. 布隆过滤器不需要存储元素本身,保密工作更好
  4. 有很大大的空间优势

缺点

  1. 存在误判,不能准确判断元素是否在集合中。(再建立白名单,保存不确定数据)
  2. 不能获取元素本身
  3. 一般不能删除元素

5. 代码实现

#include <bitset>
#include <string>
#include <vector>

//哈希函数
struct BKDRHash
{
	size_t operator()(const string& str)
	{
		size_t hash = 0;
		for (auto ch : str)
		{
			hash = hash * 131 + ch;
		}

		return hash;
	}
};

struct APHash
{
	size_t operator()(const string& str)
	{
		size_t hash = 0;
		for (size_t i = 0; i < str.size(); i++)
		{
			size_t ch = str[i];
			if ((i & 1) == 0)
			{
				hash ^= ((hash << 7) ^ ch ^ (hash >> 3));
			}
			else
			{
				hash ^= (~((hash << 11) ^ ch ^ (hash >> 5)));
			}
		}

		return hash;
	}
};

struct DJBHash
{
	size_t operator()(const string& str)
	{
		size_t hash = 5381;
		for (auto ch : str)
		{
			hash += (hash << 5) + ch;
		}

		return hash;
	}
};


//布隆过滤器实现
template<size_t N,
	class K = string,
	class Hash1 = BKDRHash,
	class Hash2 = APHash,
	class Hash3 = DJBHash>
class BloomFilter
{
public:
	void Set(const K& key)
	{
		size_t hash1 = Hash1()(key) % N;
		_bs.set(hash1);

		size_t hash2 = Hash2()(key) % N;
		_bs.set(hash2);

		size_t hash3 = Hash3()(key) % N;
		_bs.set(hash3);
	}

	//存在误判
	bool Test(const K& key)
	{
		return _bs.test(Hash1()(key) % N) && _bs.test(Hash2()(key) % N) && _bs.test(Hash3()(key) % N);
	}

private:
	bitset<N> _bs;
};

6. 布隆过滤器的应用

布隆过滤器的应用

三、哈希切割

给两个文件,分别有100亿个query,我们只要1G内存,如何寻找两个文件的交集?

答:
哈希切割

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

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

相关文章

网络基础_1

目录 网络基础 协议 协议分层 OSI七层模型 网络传输的基本流程 数据包的封装和分用 IP地址和MAC地址 网络基础 网络就是不同的计算机之间可以进行通信&#xff0c;前面我们学了同一台计算机之间通信&#xff0c;其中有进程间通信&#xff0c;前面学过的有管道&#xff…

C++ 学习之函数成员指针的一个小细节

看看下面的代码&#xff0c;你能看出错误吗 class A { public:void fun(){}}; int main() {A a;void (A:: * p)() &A::fun;(*p)(); } 这段代码在调用成员函数时存在问题。正确的方式是使用对象来调用成员函数&#xff0c;而不是通过指针。以下是修正后的代码&#xff1a…

java学校高校运动会报名信息管理系统springboot+jsp

课题研究方案&#xff1a; 结合用户的使用需求&#xff0c;本系统采用运用较为广泛的Java语言&#xff0c;springboot框架&#xff0c;HTML语言等关键技术&#xff0c;并在idea开发平台上设计与研发创业学院运动会管理系统。同时&#xff0c;使用MySQL数据库&#xff0c;设计实…

【数据清洗 | 数据规约】数据类别型数据 编码最佳实践,确定不来看看?

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

1-3、DOSBox环境搭建

语雀原文链接 文章目录 1、安装DOSBox2、Debug进入Debugrdeautq 1、安装DOSBox 官网下载下载地址&#xff1a;https://www.dosbox.com/download.php?main1此处直接下载这个附件&#xff08;内部有8086的DEBUG.EXE环境&#xff09;8086汇编工作环境.rar执行安装DOSBox0.74-wi…

2021年8月18日 Go生态洞察:整合Go的网络体验

&#x1f337;&#x1f341; 博主猫头虎&#xff08;&#x1f405;&#x1f43e;&#xff09;带您 Go to New World✨&#x1f341; &#x1f984; 博客首页——&#x1f405;&#x1f43e;猫头虎的博客&#x1f390; &#x1f433; 《面试题大全专栏》 &#x1f995; 文章图文…

带大家做一个,易上手的家常炒鸡蛋

想做这道菜 先准备五个鸡蛋 然后将鸡蛋打到碗里面 然后 加小半勺盐 这个看个人喜好 放多少都没问题 不要太咸就好 将鸡蛋搅拌均匀 起锅烧油 油温热了之后 放三个干辣椒进去炒 干辣椒烧黑后 捞出来 味道就留在油里了 然后 倒入鸡蛋液 翻炒 注意翻炒 不要粘锅底 或者 一面糊…

Oracle SQL优化

1、书写顺序和执行顺序 在Oracle SQL中&#xff0c;查询的书写顺序和执行顺序是不同的。 1.1SQL书写顺序如下&#xff1a; SELECTFROMWHEREGROUP BYHAVINGORDER BY 1.2 SQL执行顺序 FROM&#xff1a;数据源被确定&#xff0c;表连接操作也在此步骤完成。 WHERE&#xff1a;对…

防爆执法记录仪、防爆智能安全帽助力海上钻井平台远程可视化监管平台建设

推动远程安全管理&#xff0c;海上钻井"视"界拓新—防爆执法记录仪与防爆智能安全帽的创新应用 在海上钻井作业领域&#xff0c;安全生产一直是萦绕在每一个业者心头的重大课题。由于环境的恶劣及作业的特殊性&#xff0c;一旦发生安全事故&#xff0c;其后果往往极…

【MySQL】视图:简化查询

文章目录 create view … as创建视图更改或删除视图drop view 删除视图replace关键字&#xff1a;更改视图 可更新视图with check option子句&#xff1a;防止行被删除视图的其他优点简化查询减小数据库设计改动的影响使用视图限制基础表访问 create view … as创建视图 把常用…

Scrapy框架中间件(一篇文章齐全)

1、Scrapy框架初识&#xff08;点击前往查阅&#xff09; 2、Scrapy框架持久化存储&#xff08;点击前往查阅&#xff09; 3、Scrapy框架内置管道&#xff08;点击前往查阅&#xff09; 4、Scrapy框架中间件 Scrapy 是一个开源的、基于Python的爬虫框架&#xff0c;它提供了…

分支和循环

通常来说&#xff0c;C语言是结构化的程序设计语言&#xff0c;这里的结构包括顺序结构、选择结构、循环结构&#xff0c;C语言能够实现这三种结构&#xff0c;如果我们仔细分析&#xff0c;我们日常生活中所见的事情都可以拆分为这三种结构或者它们的组合。 下面我会仔细讲解我…

4.7-容器网络之host和none

这一节我们来看一下docker中的另外两种网络&#xff0c;host和none。 docker network inspect none 于是就看到Containers, 里面包含了一个test1 表示这个容器连接到了none。

【【FPGA的 MicroBlaze 的 介绍与使用 】】

FPGA的 MicroBlaze 的 介绍与使用 可编程片上系统&#xff08;SOPC&#xff09;的设计 在进行系统设计时&#xff0c;倘若系统非常复杂&#xff0c;采用传统 FPGA 单独用 Verilog/VHDL 语言进行开发的方式&#xff0c;工作量无疑是巨大的&#xff0c;这时调用 MicroBlaze 软核…

tornado模版注入 [护网杯 2018]easy_tornado 1

打开题目 打开flag.txt 告诉我们flag在 /fllllllllllllag下 打开welcome.txt 我们看到了render渲染函数&#xff0c;联想到ssti 打开hints.txt 然后我们留意到每个打开url上面都有filehash 告诉我们如果想要访问/fllllllllllllag下的flag文件&#xff0c;是需要filehash这个GE…

回文链表,剑指offer 27,力扣 61

目录 题目&#xff1a; 我们直接看题解吧&#xff1a; 解题方法&#xff1a; 难度分析&#xff1a; 审题目事例提示&#xff1a; 解题分析&#xff1a; 解题思路&#xff08;数组列表双指针&#xff09;&#xff1a; 代码说明补充&#xff1a; 代码实现&#xff1a; 代码实现&a…

Selenium——isDisplayed()、isEnabled()、isSelected()

判断页面是否存在某元素 Selenium没有直接提供判断是否存在的方法&#xff0c;可以使用findElements返回的数量判断&#xff1b;或者判断findElement是否抛出异常 webDriver.findElements(By.xpath("(//div[classel-button-group]//button)[1]")).size()isDisplaye…

2023.11.28 使用tensorflow进行“三好“权重分析

2023.11.28 使用tensorflow进行"三好"权重分析 这是最基础的一个神经网络问题。许久没有再使用&#xff0c;用来做恢复训练比较好。 x1w1 x2w2 x3*w3 y&#xff0c;已知x1,x2,x3和y&#xff0c;求w1,w2,w3 这是一个三元一次方程&#xff0c;正常需要三组数据就能…

使用 kubeadm 部署 Kubernetes 集群(一)linux环境准备

一、 初始化集群环境 准备三台 rocky8.8 操作系统的 linux 机器。每台机器配置&#xff1a;4VCPU/4G 内存/60G 硬盘 环境说明&#xff1a; IP 主机名 角色 内存 cpu 192.168.1.63 xuegod63 master 4G 4vCPU 192.168.1.64 xuegod64 worker 4G 4vCPU 192.168.1.62 xuegod62 work…

phpoffice在tp框架中如何实现导入导出功能

安装 phpoffice/phpspreadsheet 库 composer require phpoffice/phpspreadsheet 导入功能 创建一个用于上传文件的视图&#xff0c;可以使用元素来实现文件上传。 <!-- application/view/your/import.html --><form action"{:url(your/import)}" method&q…