我们在玩手机的时候,软件会给我们推送一些新消息,软件如何保证我们哪些消息看过,哪些消息没看过呢?
解决办法:用一个服务器记录我们看过的内容,为了保证能够快速查询,我们可以使用哈希表存储用户信息,但是浪费空间,我们使用位图进行存储,但是不能解决哈希冲突,将哈希表与位图结合—布隆过滤器。

布隆过滤器

是一种概率性数据结构,能够高效的查询,插入,可以告诉管理员什么东西一定不存在或者可能存在。

实现原理:
我们在快速查询一个数据是否存在时,通常有以下两种比较好的方法。

  1. 可以使用Hashmap进行查询时间复杂度为O(1),但是这样做比较耗费空间,
  2. 通过位图的形式,判断该元素是否存在,但是不能解决冲突问题。

我们将以上两种结构进行整合:通过哈希函数将保存结果映射到位图中。

  • 插入过程

  • 查询过程
    例如:
    我们想要查询com这个元素是否存在,我们通过哈希函数得出其对应的bit是1,6,7我们发现1这个bit位值为0,所以我们可以判断出其com一定不存在。
    我们查询元素你好时,当通过哈希函数返回的bit位为2,4,5我们可以得出这个元素可能存在,因为当元素插入的越多其bit位置1的情况也就越多,所以其值可能存在。
  • 删除过程
    ==布隆过滤器不支持删除,因为一旦删除一个bit位可能会影响到其他bit位。==但是Counting Bloom对其进行优化,使其bit增加一个计数器,每次删除一个元素,其对应的bit位上的计数器-1。

布隆过滤器优缺点

优点

  • 查询时间复杂度为O(k),k为哈希函数个数。
  • 不需要存储元素本身,安全,节省空间。
  • 查询的数据量大。

缺点

  • 有误报率,不能保证一个数据是否真的存在。
  • 不能获取元素本身的值。
  • 一般不能删除元素。
#include<stdio.h>
#include<string.h>class BitMap
{public:BitMap(){bitmap = NULL;size = 0;}BitMap(int size) //按照大小构造map{bitmap = NULL;bitmap = new char[size];if (bitmap == NULL)printf("error\n");else{memset(bitmap, 0, size*sizeof(char));this->size = size;}}int initBitMap(int size){bitmap = NULL;bitmap = new char[size];if (bitmap == NULL)printf("init error\n");else{memset(bitmap, 0, size*sizeof(char));this->size = size;return this->size;}}//插入一个元素int bitmapset(int index){int addr = index / 8;int addr_bit = index % 8;unsigned char temp = 0x01 << addr_bit;if (addr > (size + 1))return 0;else{bitmap[addr] |= temp;return 1;}}//判断该元素是否存在,存在返回1,不存在返回0int bitmapgrt(int index){int addr = index / 8;int addr_bit = index % 8;unsigned char temp = 0x01 << addr_bit;if (addr > (size + 1))return 0;elsereturn (bitmap[addr] & temp) > 0 ? 1 : 0;}
private:char *bitmap;size_t size;
};

C++---布隆过滤器相关推荐

  1. Redis 预防缓存穿透“神器” — 布隆过滤器

    1. 布隆过滤器 1.1 概念 在架构设计时有一种最常见的设计被称为布隆过滤器,它可以有效减少缓存穿透的情况.其主旨是采用一个很长的二进制数组,通过一系列的 Hash 函数来确定该数据是否存在. 布隆 ...

  2. 算法:详解布隆过滤器的原理、使用场景和注意事项@知乎.Young Chen

    算法:详解布隆过滤器的原理.使用场景和注意事项@知乎.Young Chen 什么是布隆过滤器 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data struc ...

  3. C++拾取——Linux下实测布隆过滤器(Bloom filter)和unordered_multiset查询效率

    布隆过滤器是一种判定元素是否存在于集合中的方法.其基本原理是使用哈希方法将数据映射到一个很长的向量上.在维基百科上,它被称为"空间效率和查询时间都远远超过一般的算法"的方法.由于它 ...

  4. 布隆过滤器 redis_使用基于 Redis 的 Java 布隆过滤器

    (给数据分析与开发加星标,提升数据技能) 转自:ImportNew 布隆过滤器是一种概率数据结构,用来高效地测试集合中是否存在某个元素.使用布隆过滤器有助于减少在磁盘中查找键值的次数,从而降低开销. ...

  5. 过滤请求绝技,布隆过滤器与布谷鸟过滤器

    欢迎关注方志朋的博客,回复"666"获面试宝典 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们 ...

  6. Redis 之布隆过滤器与布谷鸟过滤器

    欢迎关注方志朋的博客,回复"666"获面试宝典 大家都知道,在计算机中,IO一直是一个瓶颈,很多框架以及技术甚至硬件都是为了降低IO操作而生,今天聊一聊过滤器,先说一个场景: 我们 ...

  7. 从bitmap到布隆过滤器,再到高并发缓存设计策略

    点击关注公众号,Java干货及时送达 作者:that_is_cool blog.csdn.net/that_is_cool/article/details/91346356 前言:怎么能把风马牛不相及 ...

  8. 牛逼哄哄的布隆过滤器,到底有什么用?

    点击上方蓝色"方志朋",选择"设为星标" 回复"666"获取独家整理的学习资料! 原文:www.cnblogs.com/CodeBear/p ...

  9. mysql布隆过滤器源码_通过实例解析布隆过滤器工作原理及实例

    布隆过滤器 布隆过滤器是一种数据结构,比较巧妙的概率型数据结构(probabilistic data structure),特点是高效地插入和查询,可以用来告诉你 "一定不存在或者可能存在& ...

  10. mysql布隆过滤器源码_布隆过滤器(Bloom Filter)的原理和实现

    什么情况下需要布隆过滤器? 先来看几个比较常见的例子 字处理软件中,需要检查一个英语单词是否拼写正确 在 FBI,一个嫌疑人的名字是否已经在嫌疑名单上 在网络爬虫里,一个网址是否被访问过 yahoo, ...

最新文章

  1. DL之DNN:基于Tensorflow框架对神经网络算法进行参数初始化的常用九大函数及其使用案例
  2. Vue.js指令实例
  3. mysql gtid寻找位置_【MySQL】UUID与GTID以及如何根据GTID找寻filename和position
  4. 02.改善深层神经网络:超参数调试、正则化以及优化 W3. 超参数调试、Batch Norm和程序框架
  5. linux 端口限速技术,linux下如何实现对每个IP进行限制带宽??
  6. java类成员方法(成员函数)的初步介绍
  7. I - Defeat the Enemy UVALive - 7146 二分 + 贪心
  8. 关于C语言goto的使用
  9. Fedora25安装mariadb并设置权限
  10. SSRS 2012 高级图表类型 -- 气泡图与散点图
  11. linux反向连接如何免密码,编写受密码保护的反向Shell(Linux x64)
  12. SwiftUI Core ML 基础教程
  13. 单片机应用系统设计技术——多功能出租车计费器
  14. Adobe2022更新,打开photoshop总是提示需要访问钥匙串秘钥怎么解决?
  15. 状态机----C语言实现
  16. ROS:一种路径优化方法-拉直法
  17. 华为软开面经(许愿OC)
  18. Python自动登陆淘宝并爬取商品数据
  19. Java、JSP基于Web的师生互动系统的设计与实现
  20. 百度关键词质量度如何提高?9个质量度影响因素

热门文章

  1. PNG和PVR之间互相转换的脚本
  2. NullableT类型
  3. 修改linux终端的提示字符
  4. MySQL服务器意外关机-无法启动多实例
  5. python----设置默认编码
  6. “云”起风涌,邮件服务器助航企业云端升级
  7. 【FFMPEG系列】windows下编译ffmpeg且加入libx264
  8. java 读取 tgz_java – 从Spark中的压缩中读取整个文本文件
  9. antd confirm如何隐藏ok按钮_操作系统如何保护重要文件,Windows 7资源管理器设置隐藏文件夹...
  10. Linux内存管理 -- smaps讲解