布隆过滤器
布隆过滤器的作用就是判断元素,在某个元素集中是否存在。
hashmap的问题
实际上hashmap也能达到同样的效果,但与布隆过滤器的区别如下:
hashmap的大致原理就是,把所有装入的键值对都存到一个Entry对象里,然后根据key值hash出一个常数,作为该键值对的索引值,并把键值对存入与索引值相同下标的数组,下次寻找该键值对时,直接hash传入key值,然后查找数组下标与hash结果相同的项,里面就是要找的键值对。
如果两个键值对被hash到了同一个数组下标,则查询到该下标时进行遍历key值比较。
优点:查询快,且能够保存完整的键值对。
缺点:如果只是想单纯判断数值是否存在,这种判断代价有点太昂贵了,因为毕竟hashmap里保存了所有键值对的本体。
布隆过滤器
使用场景:
当数据集过大,且仅仅只是需要判断指定数据是否存在于数据集中时(布隆过滤器不具备任何储存功能,仅仅如其名称一样,只具备过滤判断元素是否存在的功能)。
算法步骤:
1、准备多个hash算法,每个hash算法都能将元素hash成一个常数(常数<n)。
2、准备一个长度为n的数组,且初始里面各项都为0
3、每“装进来”一个元素,就用准备好的多个hash算法,把元素hash成多个常数,并把数组中下标为这些常数的项设为0.
4、如果要判断一个元素“是否被装进来”过,就用准备好的hash算法对其进行hash为多个常数,并判断数组里这些常数下标中的项是否为1.
如果都为1,则表示该元素“可能”被装进来过。
如果哪怕有一项为0,则该元素一定没有被装进来过。
问题:
1、只能做到高概率保证元素存在。
由算法流程可见,即使元素hash后所有常数,在数组的对应下标里值都为1,也只是有概率该元素装载过,因为可能元素hash后的所有常数下标,刚好和其他元素的hash值相同。
2、无法从总装载元素中剔除元素。
如果我们想从已经装过的元素集中“删掉一个”,实际上也是不可能的,因为元素都被hash成多个数组下标了,你根本不能确定你删的那个数组下标只是被删元素的hash值,还是别的元素的hash值。