布隆过滤器

布隆过滤器的做用就是判断元素,在某个元素集中是否存在。算法

 

hashmap的问题数组

实际上hashmap也能达到一样的效果,但与布隆过滤器的区别以下:对象

hashmap的大体原理就是,把全部装入的键值对都存到一个Entry对象里,而后根据key值hash出一个常数,做为该键值对的索引值,并把键值对存入与索引值相同下标的数组,下次寻找该键值对时,直接hash传入key值,而后查找数组下标与hash结果相同的项,里面就是要找的键值对。索引

若是两个键值对被hash到了同一个数组下标,则查询到该下标时进行遍历key值比较。hash

优势:查询快,且可以保存完整的键值对。hashmap

缺点:若是只是想单纯判断数值是否存在,这种判断代价有点太昂贵了,由于毕竟hashmap里保存了全部键值对的本体。原理

 

布隆过滤器遍历

使用场景:map

当数据集过大,且仅仅只是须要判断指定数据是否存在于数据集中时(布隆过滤器不具有任何储存功能,仅仅如其名称同样,只具有过滤判断元素是否存在的功能)。数据

 

算法步骤:

一、准备多个hash算法,每一个hash算法都能将元素hash成一个常数(常数<n)。

二、准备一个长度为n的数组,且初始里面各项都为0

三、每“装进来”一个元素,就用准备好的多个hash算法,把元素hash成多个常数,并把数组中下标为这些常数的项设为0.

四、若是要判断一个元素“是否被装进来”过,就用准备好的hash算法对其进行hash为多个常数,并判断数组里这些常数下标中的项是否为1.

若是都为1,则表示该元素“可能”被装进来过。

若是哪怕有一项为0,则该元素必定没有被装进来过。

 

问题:

一、只能作到高几率保证元素存在。

由算法流程可见,即便元素hash后全部常数,在数组的对应下标里值都为1,也只是有几率该元素装载过,由于可能元素hash后的全部常数下标,恰好和其余元素的hash值相同。

二、没法从总装载元素中剔除元素。

若是咱们想从已经装过的元素集中“删掉一个”,实际上也是不可能的,由于元素都被hash成多个数组下标了,你根本不能肯定你删的那个数组下标只是被删元素的hash值,仍是别的元素的hash值。

相关文章
相关标签/搜索