哈希扩展之布隆过滤器

布隆过滤器是一种空间效率极高的概率型数据结构,用于判断一个元素是否在一个集合中。它通过使用多个哈希函数减少哈希冲突,但可能会产生误判。布隆过滤器包括结构体定义、初始化、销毁、插入操作和查找操作。由于可能存在假阳性,不适合需要精确结果的场景,但适用于大量数据的存储和查询,例如缓存、垃圾邮件过滤等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 布隆过滤器的引入

有这样一个题:判断一个元素是不是在其指定集合中?

我们一般的操作是将该集合先保存起来,再拿着指定元素与保存起来的集合中元素一一比较从而判断它是否存在。可是随着集合中元素的增加,我们需要的存储空间越来越大,检索的速度也越来越慢,这时我们想到了哈希表这种数据结构。哈希表通过一个哈希函数将一个元素映射成位阵列(Bit Array)中的一个点,这样我们只要查看该元素对应的点是否为1就可以知道这个集合中是否存在它。但是哈希表面临哈希冲突的问题,假设我们的位阵列长度为m个点,那么如果要将哈希冲突降低为1%,即在哈希表中保存n个元素需要满足:n/m<1%,则这个哈希表只能容纳m/100个元素。但是这样做的话,仅仅是提高了检索的速度,内存空间做不到有效存储,那么应该怎么解决呢?其实,我们可以利用多个Hash函数解决哈希冲突问题,如果有一个Hash函数计算出该元素不在指定集合中,则不是真的不存在;如果所有哈希函数均计算出该元素在指定集合中,则表示极有可能存在,这样一来就大大解决了哈希冲突问题。

而一般使用布隆过滤器是用来处理字符串是否存在在集合中问题,通过多个哈希函数计算出该字符串的多个哈希值,从而将该字符串对应的所有哈希值对应的bit位设置为1。利用这样的方式对字符串进行查找时,通过多个哈希表计算哈希值,并在哈希值对应的bit位中判断该bit位是否为1,若全为1则表示该字符串是存在的,若有一个哈希函数对应的哈希值的bit位为0则表示该字符串不存在。但是需要注意的是布隆过滤器不能进行删除操作,因为该字符串对应的bit位有可能是其他字符串也对应的bit位,故不可以进行删除操作。

2. 布隆过滤器的结构体定义

通过上面分析布隆过滤器的操作可以知道,布隆过滤器是将位图与多个哈希函数相结合实现的,故设计布隆过滤器的结构体类型时需要定义位图的结构体以及多个哈希函数。代码如下:

#include"Bitmap.h"                                                                                                       
/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值