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

    目录

    1. 什么是布隆过滤器

    2. 应用场景

    3. 布隆过滤器原理

    1. 什么是布隆过滤器 

      判断某个key一定不存在

        1. 本质上布隆过滤器是一种数据结构,比较巧妙的概率型数据结构

        2. 特点是高效地插入和查询,可以用来告诉你 “某样东西一定不存在或者可能存在”。

        3. 相比于传统的 List、Set、Map 等数据结构,它更高效、占用空间更少,但是缺点是其返回的结果是概率性的,而不是确切的。

      使用:

    1. 布隆过滤器在NoSQL数据库领域中应用的非常广泛
    2. 当用户来查询某一个row时,可以先通过内存中的布隆过滤器过滤掉大量不存在的row请求,然后去再磁盘进行查询
    3. 布隆过滤器说某个值不存在时,那肯定就是不存在,可以显著降低数据库IO请求数量

    2. 应用场景

      1)场景1(给用户推荐新闻)

        1. 当用户看过的新闻,肯定会被过滤掉,对于没有看多的新闻,可能会过滤极少的一部分(误判)。

        2. 这样可以完全保证推送给用户的新闻都是无重复的。

      2)场景2(爬虫url去重)

        1. 在爬虫系统中,我们需要对url去重,已经爬取的页面不再爬取

        2. 当url高达几千万时,如果一个集合去装下这些URL地址非常浪费空间

        3. 使用布隆过滤器可以大幅降低去重存储消耗,只不过也会使爬虫系统错过少量页面

    3. 布隆过滤器原理

      布隆过滤器(Bloom Filter)的核心实现是一个超大的位数组和几个哈希函数。假设位数组的长度为m,哈希函数的个数为k

      

    以上图为例,具体的操作流程:假设集合里面有3个元素{x, y, z},哈希函数的个数为3。首先将位数组进行初始化,将里面每个位都设置位0。对于集合里面的每一个元素,将元素依次通过3个哈希函数进行映射,每次映射都会产生一个哈希值,这个值对应位数组上面的一个点,然后将位数组对应的位置标记为1。查询W元素是否存在集合中的时候,同样的方法将W通过哈希映射到位数组上的3个点。如果3个点的其中有一个点不为1,则可以判断该元素一定不存在集合中。反之,如果3个点都为1,则该元素可能存在集合中。注意:此处不能判断该元素是否一定存在集合中,可能存在一定的误判率。可以从图中可以看到:假设某个元素通过映射对应下标为4,5,6这3个点。虽然这3个点都为1,但是很明显这3个点是不同元素经过哈希得到的位置,因此这种情况说明元素虽然不在集合中,也可能对应的都是1,这是误判率存在的原因。

      添加元素

        将要添加的元素给k个哈希函数
        得到对应于位数组上的k个位置
        将这k个位置设为1

      查询元素

        将要查询的元素给k个哈希函数
        得到对应于位数组上的k个位置
        如果k个位置有一个为0,则肯定不在集合中
        如果k个位置全部为1,则可能在集合中

  • 相关阅读:
    linux查看用户组所有成员
    navicat for mysql 在Mac上安装后没有连接列表,就是左边的那一列连接项目怎么办?
    mysql启动问题access denied for user 'root'@'localhost'(using password:YES)
    phpcms多站点表单统一到主站点管理的解决方案
    thinkphp5.0 session驱动方式问题汇总
    Python__开启进程的两种方式
    Python并发编程之操作系统理论部分
    操作系统简介
    Python__基于udp的套接字
    网络编程1
  • 原文地址:https://www.cnblogs.com/xinzaiyuan/p/12696620.html
Copyright © 2011-2022 走看看