bit_set位图|布隆过滤器

news2024/11/28 22:33:39

位图

对于海量整形数据的处理,通常是上百个G的代码。

通常有如下的应用:

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

如果将数据加载到内存中,运用基本数据结构处理,那就需要百G的内存,这是非常庞大的。

例如:要在40亿的无符号整型数据中,判断某个数在不在。

判断在否只需要0或1标记,利用hash直接定址法或hash映射,对每一个整形开辟一个char的空间。简单计算空间利用: 无符号整形的范围是2^32 约有42亿9千万 也就是开辟42亿9千万字节/大约要4G的内存空间......

优化:一个字节有8个bit位,每一个bit位记录0/1标记在否  也就是需要42亿9千万的bit位  计算得需要大约500M的内存

bitset的框架

首先要对数据处理的范围0-N开空间。bitset需要开N/32 + 1的整形来容纳这些数据。(1个整形=32bit)。这里我们用vector容器作为底层。

位图的成员函数有set(将某位置为1) reset(将某位置为0)  test(判断是否存在 1为存在,0为不存在)      flip(翻转指定位)

构造函数

提前开 N/32 + 1的整形空间,并且初始化为全0.

set

1.计算在第i个int的类型

2.计算在该int类型上j的bit位上

3.利用或运算 ,将第j位置为1

 

reset

与set相反,将某一位置为0

1.计算i _bits上

2.计算_bits的jbit位

3.与运算 与上 第j位的0,其它位的全1    ~(1<<j)

test()

得到某一位的标记 移位操作和与操作

filp()

翻转指定位

1.计算i _bits上

2.计算_bits的jbit位

3._bits[i]异或上 1的左移j位

位图的优缺点

优点:
判断海量数据的存在,判断出现次数有极大的优势。

节省空间,速度快。本质就是hash映射

缺点:

只能映射整形对于字符串,浮点型不能存储

布隆过滤器

海量处理数据,哈希表的存储占用太多空间。

位图不适用于字符串类型的处理

所以将hash和位图相结合。布隆提出过滤器

设计思路

将字符串通过hash函数映射到位图上。这时会产生hash冲突。对于位图上,判断字符串的结果可以是在于不在。

判断不在是准确的,因为hash映射上标志为0,就代表没有发生hash冲突,也没有这个字符串。 

判断在是不准确的。会发生hash冲突。多个字符串有可能映射到这个位上。

为了降低发生hash冲突的概率 布隆过滤器降低冲突概率

一个值映射到一个位置,容易误判(将在不在判断为在)。将一个值映射到多个位置,多个位的结果判断一个值,这样的误判的概率会大大降低。

结论

布隆过滤器是无法彻底解决误判问题。一个key值 通过hash函数映射到多个位,只能降低误判的概率,无法去除误判。

hash函数个数和布隆过滤器的长度选择

过小的过滤器所有的bit位均为1,查询任何结构都是“可能存在”,起不到过滤的结果。过滤器的长度直接影响误判的结果,越长的过滤器,发生哈希冲突的概率越小,误判几率越小。

hash函数的个数与key映射到位图上的速度有关,如果个数过多,位图上变为1的速度也越快,很快就发生hash碰撞。如果个数过少,误判的几率会变高。

该图展示hash个数和过滤器长度与误判率的关系

由大佬推导出来的公式

当我们设置hash函数为3个时候

k=3,ln2=0.7  m=n*k*0.7 =4.3n;

所以在hash函数为3时,布隆过滤器的长度大致为插入元素个数的4倍。

布隆过滤器的模拟

框架

布隆过滤器要实现成为一个模板类,因为布隆过滤器插入的元素是不固定的(整形,字符串)。而位图要求是整形的存储。所以通过hash函数将字符串转整形。一般情况下,布隆过滤器用于处理字符串,故在模板参数的处理,默认给string的处理。

假定传入三个hash函数,那么布隆过滤器的长度为插入元素的4倍

hash函数传入三个稳定的默认参数。

hash函数的作用就是把字符串数据转化为整形,便于建立映射关系。如果一个字符串能转化出不同的整形值,那么就有不同的映射位置。所以这里通过BKDRHash\APHash\DJBHash

选用hash冲突概率最优的字符串转化hash函数

字符串转hash文章:

字符串转hash

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;
	}
};

set

插入字符串“猪八戒”,如果hash函数映射出的三个位置分别为 1   4    7,那么这几个位置为1

此时再存入“tencent”,位图就继续发生改变

test 验证某一位

判断某一位在与否;

判断在——必须三个hash函数对应的位置同时为1   不是一定正确

判断不在——有一个hash函数的映射位为0     一定正确

支持删除么

由于布隆过滤器存在冲突,在删除一个元素时,同时也有可能影响其它元素。

是不支持删除的

  • 一种支持删除的方法(计数删除)

将布隆过滤器中的每位bit扩展成一个小的计数器,插入元素时,k个hash函数映射出的值都+1。删除时,给K个映射位都减一。

缺陷:

存在计数回绕

无法真正确定元素是否真在

布隆过滤器的使用场景

可以误判的场景

比如

用户注册名称,需要判断用户的名称是否被用过

这时候如果一个数据不在 ,那么就是准确的。那如果一个名称通过布隆过滤器被判断出在,(实际上不存在),这时候只要通过数据库的再查找。相比于全部再数据库查找,布隆过滤器极大提高效率。

布隆过滤器的优缺点

优点:
1. 增加和查询元素的时间复杂度为:O(K), (K为哈希函数的个数,一般比较小),与数据量大小
2. 哈希函数相互之间没有关系,方便硬件并行运算
3. 布隆过滤器不需要存储元素本身,在某些对保密要求比较严格的场合有很大优势
4. 在能够承受一定的误判时,布隆过滤器比其他数据结构有这很大的空间优势
5. 数据量很大时,布隆过滤器可以表示全集,其他数据结构不能
6. 使用同一组散列函数的布隆过滤器可以进行交、并、差运算

缺点

1. 有误判率,即存在假阳性(False Position),即不能准确判断元素是否在集合中(补救方法:再建立一个白名单,存储可能会误判的数据)
2. 不能获取元素本身
3. 一般情况下不能从布隆过滤器中删除元素
4. 如果采用计数方式删除,可能会存在计数回绕问题

gitee:位图和布隆过滤器的模拟实现

参考资料:

详解布隆过滤器的原理,使用场景和注意事项 - 知乎 (zhihu.com)

各种字符串Hash函数 - clq - 博客园 (cnblogs.com)

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

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

相关文章

foobar2000 突然无法正常输出DSD信号

之前一直在用foobar2000加外置dac听音乐&#xff0c;有一天突然发现听dsd的时候&#xff0c;dac面板显示输出的是PCM格式信号&#xff0c;而不是DSD信号&#xff0c;这让我觉得很奇怪&#xff0c;反复折腾了几次&#xff0c;卸载安装驱动什么的&#xff0c;依然如此&#xff0c…

Kubernetes技术与架构-配置

一般情况下&#xff0c;Kubernetes使用yaml文件格式定义配置文件&#xff0c;配置文件须指定对应的API稳定版本号&#xff0c;将配置文件进行版本控制、在发布新版本的过程中出问题时可以执行版本回滚操作&#xff0c;将相关联的对象定义在同一个配置文件中、从而更容易地管理&…

springboot宠物店管理系统-计算机毕设 附源码 32041

SpringBoot宠物店管理系统 摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;宠物行业当然也不例外。宠物店管理系统是以实际运用为开发背景&#xff0c;运用软件工程原理…

Failed to initialize NVML: Driver/library version mismatch

做一个项目的时候&#xff0c;发现vscode一开始训练就报如下错误 RuntimeError: CUDA out of memory. Tried to allocate 916.00 MiB (GPU 0; 6.00 GiB total capacity; 4.47 GiB already allocated; 186.44 MiB free; 4.47 GiB reserved in total by PyTorch) 正常来说这是…

2023-3年CSDN创作纪念日

机缘 今天开开心心出门去上班&#xff0c;就收到了一个csdn私信&#xff0c;打开一看说是给我惊喜来着&#xff0c;我心想csdn还能给惊喜&#xff1f;以为是有什么奖品或者周边之类的&#xff0c;结果什么也没有&#xff0c;打开就是一份信&#x1f602;。 也挺不错的&#xf…

【理解ARM架构】 散列文件 | 重定位

&#x1f431;作者&#xff1a;一只大喵咪1201 &#x1f431;专栏&#xff1a;《理解ARM架构》 &#x1f525;格言&#xff1a;你只管努力&#xff0c;剩下的交给时间&#xff01; 目录 &#x1f3d3;引出重定位&#x1f3d3;散列文件&#x1f3d3;可读可写数据段重定位&#…

Kibana部署

服务器 安装软件主机名IP地址系统版本配置KibanaElk10.3.145.14centos7.5.18042核4G软件版本&#xff1a;nginx-1.14.2、kibana-7.13.2-linux-x86_64.tar.gz 1. 安装配置Kibana &#xff08;1&#xff09;安装 [rootelk ~]# tar zxf kibana-7.13.2-linux-x86_64.tar.gz -C…

leetcode算法之链表

目录 1.两数相加2.两两交换链表中的节点3.重排链表4.合并K个升序链表5.K个一组翻转链表 1.两数相加 两数相加 /*** Definition for singly-linked list.* struct ListNode {* int val;* ListNode *next;* ListNode() : val(0), next(nullptr) {}* ListNode(…

针对c语言的scanf读取字符和字符串解析

在scanf函数中&#xff0c;格式字符串里的空格字符有特定的作用。 当你在格式字符串里放置一个空格时&#xff0c;scanf会尝试匹配并消耗输入中的一个或多个空白字符&#xff08;包括空格、制表符或换行符&#xff09;。换句话说&#xff0c;它会跳过任何空白字符&#xff0c;…

针对哈希冲突的解决方法

了解哈希表和哈希冲突是什么 哈希表&#xff1a;是一种实现关联数组抽象数据类型的数据结构&#xff0c;这种结构可以将关键码映射到给定值。简单来说哈希表&#xff08;key-value&#xff09;之间存在一个映射关系&#xff0c;是键值对的关系&#xff0c;一个键对应一个值。 …

蓝桥杯第四场双周赛(1~6)

1、水题 2、模拟题&#xff0c;写个函数即可 #define pb push_back #define x first #define y second #define int long long #define endl \n const LL maxn 4e057; const LL N 5e0510; const LL mod 1e097; const int inf 0x3f3f; const LL llinf 5e18;typedef pair…

java_基础_关键字

1.关键字的字母全部都是小写. 2.常用的代码编辑器(Notepad),针对关键字有特殊的颜色标记,非常的直观.

CleanMyMac X好不好用?有哪些优势

CleanMyMac X2024正是这一愿景和使命的体现。 作为一个团队&#xff0c;我们致力于采用令人过目不忘的设计来打造我们引以为豪的产品。 这是 UX/UI 设计已经成为我们核心价值的原因之一。 这也是我们不断完善它&#xff0c;从而为我们的用户创造最神奇体验的动力。 CleanMyMac …

基于springboot实现智慧党建系统项目【项目源码】

基于springboot实现智慧党建系统演示 Java技术 Java是由Sun公司推出的一门跨平台的面向对象的程序设计语言。因为Java 技术具有卓越的通用性、高效性、健壮的安全性和平台移植性的特点&#xff0c;而且Java是开源的&#xff0c;拥有全世界最大的开发者专业社群&#xff0c;所以…

Drools Rule Language 学习笔记

Drools Rule Language 1 Packages in DRL 可以有多个packages但推荐只用一个packageexample&#xff1a; package org.mortgages; 2 Import statements in DRL 2.1 You specify the package and data object in the format packageName.objectName, with multiple imports …

野火霸天虎 STM32F407 学习笔记(六)系统时钟详解

STM32 中级 前言 仍然是学习自野火F407网课。 启动文件详解 作用&#xff1a; 初始化堆栈指针 SP_initial_sp初始化 PC 指针 Reset_Handler初始化中断向量表配置系统时钟调用 C 库函数 _main 初始化用户堆栈&#xff0c;从而最终调用 main 函数去到 C 的世界 栈&#xff…

外观设计模式

package com.jmj.pattern.facade;public class Light {public void on(){System.out.println("打开电灯...");}public void off(){System.out.println("关闭电灯...");} }package com.jmj.pattern.facade;public class AirCondition {public void on(){S…

STM32入门学习(一):STM32 简介与软件安装

参考引用 STM32 入门教程-江科协 1. STM32 简介 1.1 STM32 套件介绍 1.2 STM32 简介 STM32 是 ST 公司基于 ARM Cortex-M 内核开发的 32 位微控制器 应用&#xff1a;嵌入式领域&#xff0c;如智能车、无人机、机器人、无线通信、物联网、工业控制、娱乐电子产品等 1.3 ARM …

国内20个大模型中文场景测评及体验

中文场景能力测评 SuperCLUE排行榜 大模型及网站 公司&#xff08;大模型&#xff09; 智能程度 借鉴点 体验网站 备注 1 百度文心一言 高   文心一言   2 百川智能 高   百川大模型-汇聚世界知识 创作妙笔生花-百川智能   3 商汤商量SenseChat&#xff…

徕芬不是满分:自称超越戴森,用户称多次故障,品控仍是老大难?

撰稿|行星 来源|贝多财经 “双十一”购物节落下帷幕后&#xff0c;各大品牌纷纷公布“战报”。其中&#xff0c;高速吹风机品牌徕芬&#xff08;也称“徕芬科技”&#xff09;销售额超4.4亿元&#xff0c;全系产品销量超过80万台&#xff0c;高速吹风机系列单品(LF03、SE)销售…