码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • [C++] 布隆过滤器的模拟实现


    布隆过滤器

    • 定义
    • 目的
    • 布隆过滤器的优点
    • 布隆过滤器的缺陷
    • 布隆过滤器的模拟实现
      • 1)实现基本框架
      • 2)实现基本操作
        • Set---比特位置1
        • Test---测试某个数据是否在位图中

    定义

    • 将一个元素用多个哈希函数映射到一个位图中,因此被映射到的位置的比特位一定为1;
    • 布隆过滤器如果说某个元素不存在时,该元素一定不存在;如果该元素存在时,该元素可能存在,因为有些哈希函数存在一定的误判;
    • 布隆过滤器不能直接支持删除工作,因为在删除一个元素时,可能会影响其他元素。

    目的

    • 像string这样的类映射到位图上时,容易产生冲突,但是这种冲突我们又没办法彻底解决,只能减少冲突;所以,使用布隆过滤器减少冲突,可能会增加误判,但是误判的概率降低了。

    布隆过滤器的优点

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

    布隆过滤器的缺陷

    1. 有误判率,不能准确判断元素是否在集合中
    2. 不能获取元素本身
    3. 一般情况下不能从布隆过滤器中删除元素
    4. 如果采用计数方式删除,可能会存在==计数回绕问题 ==

    布隆过滤器的模拟实现

    1)实现基本框架

    • 底层是位图,使用BKDRHash、SDBMHash、RSHash这三个哈希函数
    template <size_t N, class K = string, 
    	class Hash_1 = BKDRHash, 
    	class Hash_2 = SDBMHash,
    	class Hash_3 = RSHash>
    class BloomFilter{
    	private:
    		BitSet<N> _bs;
    	};
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    2)实现基本操作

    Set—比特位置1

    void Set(const K& x){
    			/*	Hash_1 h1;
    			h1(x);*/
    			size_t i1 = Hash_1()(x) % N;
    			size_t i2 = Hash_2()(x) % N;
    			size_t i3 = Hash_3()(x) % N;
    			cout << i1 << " " << i2 << " " << i3 << endl;
    			_bs.set(i1);
    			_bs.set(i2);
    			_bs.set(i3);
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11

    Test—测试某个数据是否在位图中

    • 如果位图上有一个位上的值不为1,则不存在;全部为1,可能存在(误判)
    bool Test(const K& key){
    			size_t i1 = Hash_1()(key) % N;
    			size_t i2 = Hash_2()(key) % N;
    			size_t i3 = Hash_3()(key) % N;
    			if (!_bs.test(i1))
    				return false;
    			if (!_bs.test(i2))
    				return false;
    			if (!_bs.test(i3))
    				return false;
    			return true;
    		}
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
  • 相关阅读:
    8月报考季,软考选科目避坑指南来啦
    HCNP Routing&Switching之RSTP
    腾讯小程序音视频 TRTC live-pusher 黑屏等各种问题
    34-基于stm32单片机简易数字示波器设计(实物图+原理图+PCB+参考论文)
    Eclipse Xtext 实现PLC ST 语言到C的转换
    swift 【block】
    面试题:MySQL 中 InnoDB 的索引结构以及使用 B+ 树实现索引的原因
    Java序列化与反序列化
    Linux下 生成coredump文件
    Linux(centos)服务器10秒快速配置Java环境
  • 原文地址:https://blog.csdn.net/Darling_sheeps/article/details/127741411
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号