bitmap 和布隆过滤器

如何解决排重问题:java

对于大量的数据,有不少排重方案可使用,典型的就是哈希表。哈希表实际上为每个可能出现的数字提供了一个一一映射的关系,每一个元素都至关于有了本身的独享的一份空间,这个映射由散列函数来提供(这里咱们先不考虑碰撞)。实际上哈希表甚至还能记录每一个元素出现的次数,可是用哈希表的话,会占用不少的空间,因此此处不考虑。算法

作两件事:数组

  1. 集合中每一个元素有一个独享的空间
  2. 找到一个到这个空间的映射方法

Bitmap的好处在于空间复杂度不随原始集合内元素的个数增长而增长,而它的坏处也源于这一点——空间复杂度随集合内最大元素增大而线性增大maven

google的guava包中提供了BloomFilter类,新建一个maven工程,引入guava包  函数

<dependency>  

            <groupId>com.google.guava</groupId>  

           <artifactId>guava</artifactId>  

            <version>22.0</version>  

       </dependency> 

bloom算法相似一个hash set,用来判断某个元素(key)是否在某个集合中。和通常的hash set不一样的是,这个算法无需存储key的值,对于每一个key,只须要k个比特位,每一个存储一个标志,用来判断key是否在集合中。google

算法:
1. 首先须要k个hash函数,每一个函数能够把key散列成为1个整数
2. 初始化时,须要一个长度为n比特的数组,每一个比特位初始化为0
3. 某个key加入集合时,用k个hash函数计算出k个散列值,并把数组中对应的比特位置为1
4. 判断某个key是否在集合时,用k个hash函数计算出k个散列值,并查询数组中对应的比特位,若是全部的比特位都是1,认为在集合中。code

优势:不须要存储key,节省空间hash

缺点:
1. 算法判断key在集合中时,有必定的几率key其实不在集合中
2. 没法删除it

 

它其实是由一个很长的二进制向量和一系列随机映射函数组成,布隆过滤器能够用于检索一个元素是否在一个集合中。它的优势是空间效率和查询时间都远远超过通常的算法,缺点是有必定的误识别率(假正例False positives,即Bloom Filter报告某一元素存在于某集合中,可是实际上该元素并不在集合中)和删除困难,可是没有识别错误的情形(即假反例False negatives,若是某个元素确实没有在该集合中,那么Bloom Filter 是不会报告该元素存在于集合中的,因此不会漏报)。io