位图与布隆过滤器简明介绍

一个由1亿个数组成的集合M,数的范围从1~10亿

新来一个数n,如何快速且省内存地判断是否存在M中?

方法一:

将集合M的数用散列表保存,然后对数n判断是否在散列表中即可
消耗内存:假设一个数用4字节保存,1亿个数至少要381M内存,不过由于实际上由于有装载因子,散列冲突解决等,实际内存远远不止381M

方法二:

申请一个大小为10亿,数据类型为布尔的“特殊”散列表,将这一亿个数作为散列表下标,将值设成True

不过很多语言的布尔大小是1字节,并不能节省很大空间,实际上只需要使用1个二进制位,来表示true和false两个值就行了。

这就要用到位运算了,借助编程语言提供的数据类型,比如int,char等,通过位运算,用其中的某个位表示某个数字。
这就是位图

消耗大小:约120M

布隆过滤器

不过位图有个问题,想想看,如果数的范围是1到100亿呢,那位图消耗的大小就是1.2G了!!,相对于散列表,不降反升。
这个时候,总算轮到今天的主角:布隆过滤器登场了,它其实是对位图一种改进。

  • 针对数据范围是1到100亿的集合,还是申请10亿的二进制大小的位图(消耗内存120M)
  • 使用多个哈希函数,得到k个不同的哈希值,记为 x1,x2,x3...xk。将k个数字作为位图中的下标,将对应的值设为1
  • 适当选择k个哈希函数,k个哈希值都相同的概率就非常低了,但又会带来新的问题,那就是误判

布隆过滤器的误判有个特点:

没有就是没有,有就有极低的可能会没有 :)

  • 因此布隆过滤器适合过误判有一定容忍度的场景
    爬虫去重
    海量图库的判重

原文地址:https://www.cnblogs.com/yeni/p/11699709.html

时间: 2024-11-05 02:19:09

位图与布隆过滤器简明介绍的相关文章

位图与布隆过滤器

给40亿个不重复的无符号整数,没排过序.给一个无符号整数,如何快速判断一个数是否在这40亿个数中.这个问题怎么解决呢? [位图方法]: 位图(BitMap) 是用一个数组中的每个数据的每个二进制位表示一个数是否存在.1表示存在,0表示不存在. 相当于把数组分成很多块的空间,每一块是32个比特位. 原来32个比特位放一个数据,现在一个位就可以放一个数据.16GB/32=0.5GB=512MB. #ifndef __BITMAP_H__#define __BITMAP_H__#include<ios

hbase中的位图索引--布隆过滤器

在hbase中,读业务是非常频繁的.很多操作都是客户端根据meta表定位到具体的regionserver然后再查询region中的具体的数据. 但是现在问题来了,一个region由一个memstore以及多个filestore组成,memstore类似缓存在服务器内存中,可以提高插入的效率,当memstore达到一定大小(由hbase.hregion.memstore.flush.size设置)或者说用户手动flush之后,就会固化存储在hdfs之类的磁盘系统上.也就是说一个region可以对应

Hbase 布隆过滤器BloomFilter介绍

1.主要功能 提高随机读的性能 2.存储开销 bloom filter的数据存在StoreFile的meta中,一旦写入无法更新,由于StoreFile是不可变的.Bloomfilter是一个列族(cf)级别的配置属性,假设你在表中设置了Bloomfilter,那么HBase会在生成StoreFile时包括一份bloomfilter结构的数据,称其为MetaBlock:MetaBlock与DataBlock(真实的KeyValue数据)一起由LRUBlockCache维护.所以,开启bloomf

位图&布隆过滤器

位图定义: 利用位的状态来存放一个数是否存在,其实就是把一个数映射成一个简单的数用以标记他是否存在,一般使用情况为查找一个数是否存在. 数据结构: 1/8=0    1%8=1   1<<1(第二个bit位置1) 2/8=0    2%8=2   1<<2(第3个bit位置1) 3/8=0    3%8=3  1<<3(第4个bit位置1) 4/8=0    .... 查找这个数是否存在: 先算出这个数的存在位置,然后找这个位置是否为1,如果是则存在否则不存在. 缺点:

海量信息库,查找是否存在(bloom filter布隆过滤器)

Bloom Filter(布隆过滤器) 布隆过滤器用于测试某一元素是否存在于给定的集合中,是一种空间利用率很高的随机数据结构(probabilistic data structure),存在一定的误识别率(false positive),即布隆过滤器报告某一元素存在于某集合中,但是实际上该元素并不在集合中,但是没有错误识别的情形(false negative),即如果某个元素确实没有在该集合中,那么布隆过滤器是不会报告该元素存在于集合中的,没有漏报的情形出现,召回率为百分之百. 算法描述 布隆过

【干货】位图的实现与布隆过滤器

位图是用一个btye位来表示一个数据是否存在,再通过哈希函数确定一个数据所在的位置,这样处理会使当仅需要判断一个数据在不在的时候大大的提高效率,缩小内存的使用,如一个数据为int型,而一个int型的数据构成的位图能表示32个数据的存在状态.代码实现如下: Bitmap.h: #include<vector> class BitMap { public: BitMap(size_t size) :_size(0) { Size(size); } void Set(size_t key) { si

【数据结构】位图BitMap、布隆过滤器的算法实现

我们先给出之前我看过的腾讯公司的一道笔试题,引出位图BitMap. 给40亿个不重复的无符号整数,没排过序.给一个无符号整数,如何快速判断一个数是否在这40亿个数中. 这个问题怎么解决呢? 1)将40亿数据保存起来(保存在数组.链表.树中),再和该数判断是否相等. 那我们思考一下需要多少内存: 2)借助位图BitMap解决. 位图(BitMap) 是用一个数组中的每个数据的每个二进制位表示一个数是否存在.1表示存在,0表示不存在. 相当于把数组分成很多块的空间,每一块是32个比特位. 原来32个

位图应用之布隆过滤器

布隆(Burton Howard Bloom)在1970年提出的.它实际上是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器可以用于检索一个元素是否在一个集合中.它的优点是空间效率和查询时间都远远超过一般的算法,缺点是有一定的误识别率 ... bbs.chinaacc.com/forum-2-3/topic-5672277.html bbs.chinaacc.com/forum-2-3/topic-5672278.html bbs.chinaacc.com/forum-2-3/topi

位图与布隆及大数据处理题型分析

1.位图 由题引入: [腾讯]:2.给40亿个不重复的无符号整数,没排过序.给一个无符号整数,如何快速判断一个数是否在这40亿个数中. 如果将40亿个数按整型放入内存,显然不科学,就算内存足够,这样做也是浪费空间. 解决思路:用一个比特位表示一个数,存在的话该位上就置为1,不在的话置为0:这样40亿个数需要40亿个比特位,换算一下也就是500M,相对于16G来说,大大节省了空间. 注意:位图只适合判断,查找数据是否存在,且只能对整数进行处理. 代码如下: 1 class BitMap 2 { 3