zoukankan      html  css  js  c++  java
  • 布隆过滤器

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

    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值。

  • 相关阅读:
    突袭HTML5之HTML元素扩展(上) 新增加的元素
    DIV常见任务(下) 变身为编辑器
    突袭HTML5之Javascript API扩展3 本地存储
    突袭HTML5之Javascript API扩展5 其他扩展
    DIV常见任务(上) 常规任务
    突袭HTML5之HTML元素扩展(下) 增强的Form元素
    突袭HTML5之WebGL 3D概述(下) 借助类库开发
    突袭HTML5之Javascript API扩展4 拖拽
    突袭HTML5之Javascript API扩展1 Web Worker异步执行
    突袭HTML5之Javascript API扩展2 地理信息服务
  • 原文地址:https://www.cnblogs.com/red-code/p/10864738.html
Copyright © 2011-2022 走看看