C++布隆过滤器,哈希切割

C++——哈希练习题 输出结果中的每个元素一定是 唯一 的。A:依次读取文件A中的query,i = Hash(query)%1000,这个query就进去Ai小文件。B:依次读取文件B中的query,i = Hash(query)%1000,这个query就进去Bi小文件。输入:nums1 = [4,9,5], nums2 = [9,4,9,8,4]输入:nums1 = [1,2,2,1], nums2 = [2,2]输入:nums = [5,1,5,2,5,3,5,4]输入:nums = [2,1,2,5,3,2] 阅读详情

目录

一、哈希切割(用于处理大量的数据)

二、布隆过滤器

2.1、什么是布隆过滤器

2.2布隆过滤器的应用场景

2.3 布隆过滤器的模拟实现

2.3.1 布隆过滤器长度的设置

2.3.2 插入操作

2.3.3 查找操作

2.3.4 布隆过滤器删除

2.4 布隆过滤器的应用


一、哈希切割(用于处理大量的数据)

        前面我们学过为了实现哈希映射,我们需要一个哈希函数,这里我们也可以使用哈希函数把IP转为整型。比方说我们分成了100份小文件,idx = HashFunc(IP) % 100,idx是几就把它放进几号文件中。

        我们可以把每个小文件理解为一个哈希桶。
        这样不一样的IP可能分进同一个小文件中,但是同一个IP一定会分进同一个小文件。

        这里还可能出现一个情况:其中一个小文件的大小可能超过1G(假设超过1G就不够了)。
而超过了1G也有有两种情况:

1️⃣ 不重复的IP很多,map需要很多节点,统计不下。
2️⃣ 重复的IP很多,map不需要很多节点,统计的下。

        针对第一种情况,我们可以换个哈希函数递归切分。
        但是这种方法对情况二无效,因为相同的IP太多,照样会切分超过1G。

所以综合考虑可以这样统计:

不管是啥情况,都直接用map统计,如果是第二种情况就直接统计完成了。
如果是第一种情况,会insert失败,我们可以捕获异常,此时再去换个哈希函数递归切分。

二、布隆过滤器

通过上一篇的讲解我们可以看出:①位图的优点是节省空间和效率高
                                                      ②缺点是要求范围相对集中,而且只能是整型。

而如果是字符串我们想使用位图,就可以使用哈希函数转成整型。
这里就会有一种情况,不同的字符串可能转换成同一个整型。 会导致误判。

存在是不准确的,如果只有str1和str2,而str3映射的位置跟str2重了,
就会导致原本不在的元素误判成在。
所以布隆过滤器会有两种判断状况
①不存在(百分百准确)
②可能存在(可能误判,即哈希冲突)

2.1、什么是布隆过滤器

        它的主要思想是让一个值映射多个位置。我们可以使用多个哈希函数,多映射几个位置,这里假设有两个哈希函数,映射两个位置。

这样我们要看str2是否存在,必须要同时指向红色和绿色才能判断为存在。

所以布隆过滤器的作用就是降低误判率。映射的位置越多,误判率越低。
但是这里映射的位置也不能太多,映射的多,占的空间也多,找的次数也多,我们使用位图这样的方式就是为了提高效率并且节省空间。映射的多了也就没那么节省空间了。

2.2布隆过滤器的应用场景

【场景一】
        当我们要写一个注册系统的时候,我们注册昵称的时候不能跟别人重复,此时我们就可以采用布隆过滤器,如果不在那么就是准确的,一定不存在。但是如果显示存在,则有可能是误判。因为布隆过滤器中如果存在可能会误判,可以到数据库中再次查询昵称号码存不存在。

有人可能问这有必要加一个布隆过滤器吗?

假设现在来了100不存在的值,大部分都会显示不存在,
只有很小一部分会误判为存在,这样没有误判的大部分效率大大提高。

【场景二】
        我们在访问网站的时候有时候会出现风险网站。我们可以把这些网页加入黑名单,在我们访问网站之前就先经过布隆过滤器,有风险就可以快速的判断。

2.3 布隆过滤器的模拟实现

        布隆过滤器最常见的是string类型。 这里要给一个非类型模板参数N以确定开的空间有多大,这里我们写三个哈希函数。而字符串转整型的哈希函数有很多:
各种字符串Hash函数

这里我们就取里面效率较高的三个:

struct BKDRHash
{
	size_t operator()(const std::string& s)
	{
		size_t value = 0;
		for (auto ch : s)
		{
			value *= 31;
			value += ch;
		}
		return value;
	}
};

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

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

2.3.1 布隆过滤器长度的设置

        关于长度的问题这里有专门的文章进行讲述:
详解布隆过滤器的原理
里面有一个公式:

        这里n我们是知道的,假设k是3,ln2约等于0.7,最后得到m=4.2*n,所以布隆过滤器多一个数据要开大约4.2个比特位,我们直接按加入一个数据开5个比特位算。

template<size_t N,
class K = std::string,
class HashFunc1 = BKDRHash,
class HashFunc2 = APHash,
class HashFunc3 = DJBHash>
class BloomFilter
{
public:
private:
	std::bitset<N * 5> _bs;
};

2.3.2 插入操作

大致思路跟我们上面的位图一样,这里我们使用库里的函数bitset头文件:#include <bitset>而set函数库里面已经帮我们实现好了:

void set(const K& x)
{
	size_t idx1 = HashFunc1()(x) % (5 * N);
	size_t idx2 = HashFunc2()(x) % (5 * N);
	size_t idx3 = HashFunc3()(x) % (5 * N);
	_bs.set(idx1);
	_bs.set(idx2);
	_bs.set(idx3);
}

2.3.3 查找操作

这里只要有一处不在那么就返回false,全部都在才能返回true。

bool test(const K& x)
{
	size_t idx1 = HashFunc1()(x) % (5 * N);
	if (!_bs.test(idx1))
	{
		return false;
	}
	size_t idx2 = HashFunc2()(x) % (5 * N);
	if (!_bs.test(idx2))
	{
		return false;
	}
	size_t idx3 = HashFunc3()(x) % (5 * N);
	if (!_bs.test(idx3))
	{
		return false;
	}
	return true;
}

2.3.4 布隆过滤器删除

        布隆过滤器一般不能支持删除,因为一个位置可能被多个值映射,删除以后可能把别人的也删掉了。

那么我们能不能强制支持删除呢?

        我们可以去计数,有几个值映射计数器就是几,删除了就让当前位置的计数器--。
但是使用计数又会有问题:因为不知道计数器的范围,所以不能开的太小的比特位,导致使用过多内存。

2.4 布隆过滤器的应用

        给两个文件,分别有100亿个query,我们只有1G内存,如何找到两个文件交集?分别给出精确算法和 近似算法。(query就是sql语句,可以理解为一个字符串。,也可能是网络请求url,也就是网址)

近似算法我们直接使用布隆过滤器,将一个文件的query语句放进布隆过滤器里,
然后另一个文件查找在不在就是交集。虽然有误判:不存在的也被当做交集。
但是作为近似算法还是可行的。
而精确算法就得用到前面的哈希切割。
同时把两个文件都切分成数个小文件,在编号相同的小文件查看交集即可,最后注意去重。

Cortex-M异常处理深度解析:从HardFault到调试实战 在嵌入式开发中,Cortex-M系列处理器的异常处理机制是保障系统可靠性的核心。然而,面对HardFault、MemManage、BusFault等异常时,开发者往往陷入迷茫。本文结合SEGGER AN00016和Keil AN209两篇权威文档,深入剖析异常根源、寄存器解析及调试技巧,并通过代码实例演示如何快速定位问题。 阅读详情

相关推荐

YOLO11实战 第001期-基于yolo11的CrowdHuman密集行人目标检测实战文档(yolo格式数据免费获取)

1.数据阶段在拥挤/遮挡场景下,使用crowdhuman数据集重训练后的yolo11,效果表现较好。crowdhuman数据集标签如下,有Head BBox、Visible BBox、Full BBox。如下图显示:数据集介绍CrowdHuman数据集是旷世发布的用于行人检测的数据集,图片数据大多来自于google搜索。CrowdHuman数据集数据量比较大,15000张,5000张,验证集4370张。训练集和验证集中共有470K个实例,约每张图片包含23个人,同时存在各种各样的遮挡。

深度学习算法工程师,专注于前沿算法研究与实战应用。在这里,我将分享深度学习领域的实战经验、优质数据集资源以及最新论文解读与精度分析,旨在与广大技术爱好者共同探索人工智能的奥秘,助力技术成长与创新。 2168

位图 | 布隆过滤器 | 海量数据处理(哈希切割)

位图,布隆过滤器已经海量数据处理(哈希切割)

KL4180的博客 358

Claude Code + 自定义模型体验

AI 编程工具的发展突飞猛进:Cursor 横空出世,推出了“Agent 模式”;新竞争者如 Windsurf 也纷纷加入战局。几乎所有产品都开始转向“代理式(agentic)”开发模式——不再依赖单次 LLM 响应进行补全,而是让大模型在一个循环中调用各种工具,来完成更复杂的任务:分析代码库上下文、读取网页与文档、编译程序、运行测试、修复失败构建或测试、不断迭代等。

西京刀客 5799

C++学习记录——이십사 位图、布隆过滤器、哈希切割

部分哈希算法

kongqizyd146的博客 532

centos7部署mysql8.0.35,主从复制,主主集群

centos7 linux部署mysql,主从复制,主主模式

zaixiaqin的博客 1990

保姆级教程:用海康威视老版存储服务器+IVMS-4200搭建本地监控录像(附软件获取与开机自启)

最近在帮朋友搭建一套小型监控系统时,遇到了一个颇具挑战性的问题:手头有几台海康威视网络摄像头,但官方已经下架了配套的存储服务器软件。经过一周的摸索和测试,终于找到了一套可靠的解决方案。本文将完整分享从软件获取到系统稳定运行的全过程,特别适合那些不想额外购买NVR设备,又需要本地存储监控录像的个人用户或小型企业IT管理员。

weixin_30553777的博客 515

哈量数据处理面试题(哈希切割,位图,布隆过滤器)

目录 前言 一.位图应用 二.布隆过滤器 三.哈希切割 前言 海量数据处理,顾名思义。就是数据两很大,内存不足以保存这么多数据的问题该如何解决。 一般可以使用位图(整形),布隆过滤器(非整形),哈希切割的方法。 一.位图应用 给定100亿个整数,设计算法找到知出现一次的整数? 首先估算,100亿整数保存需要多少空间?1个整数4字节,100亿整数400亿字节。1G10亿字节,所以这里差不多要10G。内存无法将数据全部保存,只能将数据保存在硬...

weixin_57023347的博客 449

【DDSCAT——离散偶极近似仿真程序04】参数理解和模型设计

在这一部分,我们开始理解DDSCAT程序设计中的一些参数问题。 承接第二部分内容中的ddscat.par文件,我们来聊一聊偶极子、实际体积、有效半径等关键词。 一、偶极子点阵 手册中说,我们需要设计模型(target/目标),它是有偶极子点阵组成的。偶极子,顾名思义,是由一对电荷组成的,但我们不用设计一对,我们设计一个点就行,...

XD_Yangf的博客 7552

使用hash拆分文件

package readImgUrl; import java.io.BufferedInputStream;import java.io.BufferedReader;import java.io.BufferedWriter;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;im...

彬正的博客 1484

AIGC算法工程师面试八股文深度解析与进阶指南:揭秘Diffusion Models核心原理与实战技巧

总结来说,Cosine Noise Scheduler 的核心优势在于它能够更巧妙地平衡信号和噪声的比例,在扩散过程的早期阶段更长时间地保留原始图像的细节信息,从而为去噪模型提供一个更友好的学习环境,最终带来更优异的生成质量。🚀

FJN110的博客 346

学Simulink——基于Simulink的扰动观测器(DOB)补偿坡道重力分量

(质量5kg,坡度30°,目标速度1m/s)为例,基于Simulink搭建“DOB+PI”复合控制仿真平台,从系统建模、DOB算法推导、离散化实现到Simulink模块搭建,提供模块化模型、核心代码及参数整定表,帮助工程师彻底解决重力等恒值扰动引起的稳态误差问题。采用双线性变换(Tustin): s=Ts​2​z+1z−1​,其中 Ts​为控制周期。模块相加(注意符号:ufinal​=upi​−ucomp​或 upi​+ucomp​,取决于扰动定义方向,此处假设重力为正,控制力需反向抵消,故为减)。

MHD0815的博客 69

根据哈希值分割train/validation set

train set 和 val set 的分隔可以用numpy实现: import numpy as np np.random.seed(42) # For illustration only. Sklearn has train_test_split() def split_train_test(data, test_ratio): shuffled_indices = np.rando...

Jim_Sun_Jing的博客 495

[PCIe5.0] 3.4.1 Flow Control Initialization State Machine Rules

流控初始化是PCIe链路中每个虚拟通道(VC)启用的必经流程,分为FC_INIT1和FC_INIT2两个阶段,确保发送端与接收端的缓冲区信用值协商一致。

系统固件工程师 139

【C++篇】哈希扩展:位图和布隆过滤器+哈希切割

摘要 本文介绍了位图和布隆过滤器两种数据结构及其应用。位图通过比特位存储状态,适合处理海量整数数据,支持快速查找、排序去重等操作。文章详细讲解了位图的实现原理,包括set、reset、test等核心操作,并通过位运算实现。针对40亿整数查找问题,位图仅需500MB内存,远优于常规方法。 布隆过滤器是位图的扩展,采用多个哈希函数处理字符串数据,降低误判率。虽然存在误判可能,但其空间效率高,适用于判断数据不存在。文章分析了布隆过滤器的实现方式,选取三种高效哈希函数,并解释了其优缺点。两者在大数据处理中具有重要应

Surplus886的博客 1110

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

28. C++位图 && 布隆过滤器 && 哈希切割相关

C++位图 && 布隆过滤器 && 哈希切割相关

分享C/C++/Linux/网络/数据库/数据结构 1290

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

41.C++哈希6(哈希切割/分片/位图/布隆过滤器与海量数据处理场景)

C++使用位图/布隆过滤器/哈希切割/分片处理海量数据的场景

yzc的博客 1136

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

【C++】位图+哈希切割+布隆过滤器

位图、布隆过滤器、哈希切割

qq_66314292的博客 1838

哈希的概念及其应用

哈希算法思想的概念,哈希的除留取余法,字符串哈希,哈希冲突的解决思路:闭散列和开散列,哈希的应用:c++STL的unordered系列容器、c++STL的容器位图bitset、布隆过滤器、哈希切割

m0_73693552的博客 1261

C++位图和布隆过滤器(含哈希切割)

C++位图和布隆过滤器(含哈希切割)

Xpccccc的博客 1569

从C语言到C++_32(哈希的应用)位图bitset+布隆过滤器+哈希切割

从C语言到C++_32(哈希的应用)位图bitset+布隆过滤器+哈希切割。(完整BitSet.h和BloomFilter.h )本章主要是介绍哈希思想的应用,位图解决海量数据面试题,下一部分进入C++11的系统学习。

参考书籍:《C语言程序设计》《数据结构》《C++ Primer》《Effective C++》《STL源码剖析》《现代操作系统》《UNIX环境高级编程》《图解TCP/IP》《图解HTTP》《Linux高性能服务器编程》《剑指Offer》《算法导论》 497
上一篇: C++位图(Bitmap)
下一篇: C++11新特性(上)
chen_ever
博客等级 码龄4年 497粉丝 78原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值