「C++」位图和布隆过滤器

news2025/1/20 4:45:20
在这里插入图片描述

💻文章目录

  • 位图
    • 概念
    • 位图的实现
    • 位图的应用
  • 布隆过滤器
    • 概念
    • 布隆过滤器的哈希函数
    • 布隆过滤器的插入
    • 布隆过滤器的查找
    • 布隆过滤器的删除
  • 📓总结


位图

概念

所谓位图,就是在每一位bit位上存放某种状态,1就代表存在,0就代表不存在,因为一个数据只占用一个bit位,所以其适用于海量数据,数据无重复的场景,通常用于判断某个数据存在与否。

在这里插入图片描述

位图的实现

位图一般用于整形数据的判断,内部使用一个数组来实现,可以根据数据所占bit位来分类数据所在空间(数组的下标位置), 例如 42 是一个所占bit位位32位(4字节),我们使用 42 / 32 = 1 42 / 32 = 1 42/32=1来获取其所在下标位置,再通过 42 42 % 32 42来获取其所在bit位位置。

#include <iostream>
#include <vector>

template <size_t N>		//数据的个数
class bitset 
{
public:
    bitset()
        :_count(N)
    {
        _bit.resize((N >> 5)+1);
    }

    void set(size_t which)	//插入数据
    {
        if(which > _count)
            return;

        size_t index = (which >> 5);    // 获得所在下标位置 which / 32
        size_t pos = which % 32;        // 获取bit位位置
        _bit[index] |= (1 << pos);      // 将所在 bit位改为1
    }
	
    void reset(size_t which)	//重置bit位
    {
        if(which > _count)  
            return;

        size_t index = (which >> 5);
        size_t pos = which % 32;
        _bit[index] &= ~(1 << pos);
    }

    bool test(size_t which)	//查找数据
    {
        if(which > _count)
            return false;

        size_t index = (which >> 5);
        size_t pos = which % 32;
        return _bit[index] & (1 << pos);
    }
private:
    std::vector<int> _bit;	//使用vector方便操作
    size_t _count;
};

位图的应用

  1. 快速查找某个数据是否在一个集合中
  2. 排序 + 去重
  3. 求两个集合的交集、并集等
  4. 操作系统中磁盘块标记

布隆过滤器

概念

布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概率型数据结构,特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”,它是用多个哈希函数,将一个数据映射到位图结构中。此种方式不仅可以提升查询效率,也可以节省大量的内存空间

在这里插入图片描述

布隆过滤器的哈希函数

布隆过滤器通过使用多个哈希函数来使数据冲突减少的可能性,但不是说哈希函数越多越好,一般根据业务需求来安排哈希函数的个数。

struct BKDRHash
{
	size_t operator()(const string& key)
	{
		// BKDR
		size_t hash = 0;
		for (auto e : key)
		{
			hash *= 31;
			hash += e;
		}

		return hash;
	}
};

struct APHash
{
	size_t operator()(const string& key)
	{
		size_t hash = 0;
		for (size_t i = 0; i < key.size(); i++)
		{
			char ch = key[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& key)
	{
		size_t hash = 5381;
		for(auto ch : key)
		{
			hash += (hash << 5) + ch;
		}
		return hash;
	}
};

布隆过滤器的插入

布隆过滤器通过使用多个比特位来记录数据的存在。

template<size_t N, 	//数据个数
	class K = string,		//数据类型
	class HashFunc1 = BKDRHash,	//哈希函数1
	class HashFunc2 = APHash ,	//哈希函数2
	class HashFunc3 = DJBHash>	//哈希函数3
class BloomFilter		//布隆过滤器
{
public:
	void Set(const K& key)		//记录位置
	{
		size_t hash1 = HashFunc1()(key) % N;
		size_t hash2 = HashFunc2()(key) % N;
		size_t hash3 = HashFunc3()(key) % N;

		_bs.set(hash1);
		_bs.set(hash2);
		_bs.set(hash3);
	}
private:
	bit::bitset<N> _bs;	
}

布隆过滤器的查找

布隆过滤器是将一个元素存于多个比特位中,所以得通过判断每个哈希函数所对应的位置是否为零,但也因此,其查找元素是否存在时是存在误判的,如果元素存在,不能一定确定其存在,但元素不存在可以判断其一定不存在。

bool Test(const K& key)
{			//如果一个为0,则证明其不存在。
    size_t hash1 = Hash1()(key) % N;
    if (_bs.test(hash1) == false)
        return false;

    size_t hash2 = Hash2()(key) % N;
    if (_bs.test(hash2) == false)
        return false;

    size_t hash3 = Hash3()(key) % N;
    if (_bs.test(hash3) == false)
        return false;	

    return true; 	//哈希函数对应位置全部为1.
}

布隆过滤器的删除

布隆过滤器不能直接支持删除工作,因为在删除一个元素时,可能会影响其他元素(多个哈希函数可能会标记同一个bit位)。

📓总结

位图可以将数据压缩,但只适用与整形或能转化成整形的数据。布隆过滤器可以找到一定不存在的数据,但对于存在的数据具有误判率,且一般不能删除元素。

📜博客主页:主页
📫我的专栏:C++
📱我的github:github

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

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

相关文章

linux常用命令-grep命令与ps命令详解(超详细)

文章目录 前言一、grep命令介绍1. grep命令简介2. grep命令的基本语法3. 常用的grep命令选项 二、grep命令示例用法1. 在文件中搜索匹配模式的行2. 忽略大小写地搜索匹配模式的行3. 反转匹配&#xff0c;只打印不匹配模式的行4. 显示匹配行的行号5. 统计匹配的行数6. 打印包含匹…

C++:C++11新特性--lambda表达式和包装器

文章目录 lambda表达式lambda表达式的使用规则lambda表达式的用法lambda表达式的理解函数对象和lambda表达式 包装器bind lambda表达式 首先介绍什么是lambda表达式&#xff0c;在介绍这个情景前&#xff0c;可以回忆一下算法库中的sort排序&#xff1a; // lambda表达式 voi…

HADOOP::Fsimage和Edits解析

NameNode被格式化之后&#xff0c;将在/opt/module hadoop-3.1.3/data/tmp/dfs/name/curent目录 中产生如下文件 fsimage_ 0000000000000000000 fsimage_ 0000000000000000000.md5 seen_txid VERSION (1) Fsimage文件: HDFS文件系统元数据的一个永久性的检查点&#xff0…

基于微信小程序的高校活动系统

1 前言 1.1开发背景及意义 高校课余活动管理是中职学生素质教育的重要途径及有效方式&#xff0c;特别是对于一个院校的校园文化建设、校风学风建设和学生综合素质方面的提高至关重要t叫"。良好的学生活动组织可以更好地调动学生参与活动&#xff0c;让学生展示自己的能力…

【超全】React学习笔记 中:进阶语法与原理机制

React学习笔记 React系列笔记学习 上篇笔记地址&#xff1a;【超全】React学习笔记 上&#xff1a;基础使用与脚手架 下篇笔记地址&#xff1a;【超全】React学习笔记 下&#xff1a;路由与Redux状态管理 React进阶组件概念与使用 1. React 组件进阶导读 在掌握了 React 的基…

Windows修改MAC地址的方法(以windows11为例)

我们在日常的工作中&#xff0c;如果mac地址被限制&#xff0c;就需要修改mac地址&#xff0c;本文总结一下修改windows的mac地址的方法。 方法一&#xff1a;网络适配器中配置 网络适配器中配置的方式适用于能够在网络适配器中找到物理地址(NetworkAddress)的情况。 1、打开…

CPU标高load标高;linux故障日志排查

一般情况下&#xff0c;服务器不太会出问题。但是遇到特别诡异的情况&#xff0c;多半是服务器本身的问题。遇到问题&#xff0c;我们不能一味的去排查应用&#xff0c;中间件。更应该想到服务器的问题。否则很容易出现南辕北辙的情况。 这次分享的是一次服务器故障&#xff0c…

JavaScript添加快捷键、取消浏览器默认的快捷操作、js查看键盘按钮keycode值

document.addEventListener("keydown",function (event) {// 如果不知道按键对应的数字&#xff08;keyCode&#xff09;是多少可以弹出查看一下// alert(event.keyCode)if (event.ctrlKey && event.altKey && event.view["0"] null){if(…

Spring学习笔记:Day2

昨天定的学习计划发现通过文心4.0来实现不靠谱&#xff0c;坑太多&#xff0c;今天开始跟随B站进行学习&#xff0c;争取10-15天学习一遍&#xff0c;冲啊&#xff01; 地址&#xff1a;001-课程介绍_哔哩哔哩_bilibili 今日规划&#xff1a; pt 001 - pt 018&#xff0c;提到…

Vue3实现滚动到容器底部时发送请求,加载新数据

问题来源 在项目中出现了需要在容器滚动到底部时&#xff0c;加载新的数据的需求&#xff0c;以下是解决的方案笔记 解决 画了个流程图&#xff1a; 如图&#xff0c;先添加一个动态加载的图标&#xff0c;还有全部数据载完的《到底啦...》 大概这么个样子&#xff0c;之后呢…

【C++ Primer Plus学习记录】第5章复习题

1.入口条件循环和出口条件循环之间的区别是什么&#xff1f;各种C循环分别属于其中的哪一种&#xff1f; C提供了3种循环&#xff1a;for、while和do while循环。for和while循环都是入口条件循环&#xff0c;意味着程序将在执行循环体中的语句之前检查测试条件。do while循环是…

【IDEA】导入项目发现目录消失

错误截图 这个目录里我是有文件的&#xff0c;但是导入到idea后却看不见文件 错误原因&#xff1a; 删除目录的时候不小心将.iml文件给删除了&#xff01; 解决办法 进入项目结构 选择模块&#xff0c;点击 导入模块 选择需要导入的模块的目录 从现有项目创建模块 --> 下…

智慧用电安全动态监控系统

智慧用电安全动态监控系统是一种先进的电力监控技术系统&#xff0c;它运用物联网、大数据、云计算等先进技术&#xff0c;对电力系统的运行状况进行实时监控和预警。 该系统依托电易云-智慧电力物联网&#xff0c;通过智能传感终端采集电气线路的实时运行数据&#xff0c;客户…

Redis的高可用模式

1. 什么是高可用&#xff1f; 高可用&#xff08;High Availability, HA&#xff09;是指在信息技术中确保系统、服务或应用程序在绝大多数时间内都是可操作和可访问的能力。这通常涉及以下几个关键方面&#xff1a; 最小化停机时间: 高可用系统的目标是减少因硬件故障、系统升…

【面试HOT200】二叉树——广度优先搜索篇

系列综述&#xff1a; &#x1f49e;目的&#xff1a;本系列是个人整理为了秋招面试的&#xff0c;整理期间苛求每个知识点&#xff0c;平衡理解简易度与深入程度。 &#x1f970;来源&#xff1a;材料主要源于【CodeTopHot200】进行的&#xff0c;每个知识点的修正和深入主要参…

怎样使用rtsp,rtmp摄像头低延时参于Web视频会议互动直播

业务系统中有大量的rtsp&#xff0c;rtmp等监控直播设备&#xff0c;原大部分都是单一业务监控直播之类&#xff0c;目前很多业务需要会议互动&#xff0c;需要监控参会&#xff0c;提出需摄像头拉流参会的需求&#xff0c;由于rtmp&#xff0c;rtsp原生不支持web播放&#xff…

springboot足球社区管理系统

springboot足球社区管理系统 成品项目已经更新&#xff01;同学们可以打开链接查看&#xff01;需要定做的及时联系我&#xff01;专业团队定做&#xff01;全程包售后&#xff01; 2000套项目视频链接&#xff1a;https://pan.baidu.com/s/1N4L3zMQ9nNm8nvEVfIR2pg?pwdekj…

activemq启动成功但web管理页面却无法访问

前提&#xff1a; 在linux启动activemq成功&#xff01;本地能ping通linux 处理方案&#xff1a; 确定防火墙是否关闭&#xff0c; 有两种处理方案&#xff1a;第一种-关闭防火墙&#xff1b;第二种-暴漏8161和61616两个端口 netstat -lnpt查看8161和61616端口 注意&#xf…

【超全】React学习笔记 下:路由与Redux状态管理

React学习笔记 React系列笔记学习 上篇笔记地址&#xff1a;【超全】React学习笔记 上&#xff1a;基础使用与脚手架 中篇笔记地址&#xff1a;【超全】React学习笔记 中&#xff1a;进阶语法与原理机制 React路由概念与理解使用 1. 引入 React路由是构建单页面应用(SPA, Sin…

【斗破年番】小医仙沐浴以毒攻毒,彩鳞怒杀蝎毕岩,泪目暂时下线

Hello,小伙伴们&#xff0c;我是拾荒君。 《斗破苍穹年番》国漫更新啦&#xff01;刚更新&#xff0c;拾荒君就和我的小伙伴们去观看了。在斗破年番第73集中&#xff0c;蝎毕岩为了击败萧炎&#xff0c;不惜耗尽全身实力释放出魔毒斑&#xff0c;假装攻击小医仙&#xff0c;却…