zoukankan      html  css  js  c++  java
  • 《算法

    一:引言

      - 今天,我们搞了一个聚会,邀请整个家庭的人来参加,有A,B,C......等十几个人

        - 这时候,突然A的儿子来了,说我想知道A是否来参加了聚会。

        - 于是我们拿出了参会人员的名单册(哈希表等内存方法),根据这个表,我们马上找出了A来参加了这个聚会,完美的解决的这个问题。

      - 之后过来一段时间,我们在学校搞了一场讲座,人很多,足足有两千多人

        - 这时,有个同学过来了,说导师找C有些事,想问下是不是在我们这个讲座里面。

        - 这时我们拿出来名单册,这时我们犯了愁,这个表很多,于是我们一个个找,终于找到了C......

        - 这时又来了很多同学询问D.E.F....的存在,我们焦头烂额的把这些人找了出来。

      - 后来,有一个大型的集会需要组织,足足有几万人,吸取了上次的教训,我们不打算记录所有人的名字了。

        - 这时候,我们列出了3百多项人的特性(身高,体重,性别.....)

        - 这时A来参加集会,我们记录(男,180左右,红帽子,绿衣服,黑裤子,白鞋子)

        - 这时B来参加集会,我们记录(女,170左右,没帽子,黑衣服,黑裤子,白鞋子)

        - .... 

        - 这时候有人来问 A 是否在这个集会中,我们只需要看你的特征是否满足就可以了。

        - 这就是 布隆过滤器

    二:算法背景

      - 在查询一个元素是否存在一个集合时候,一般想到的方式是把内容保存起来,之后可以通过 哈希/链表/树 等存储,之后可以快速查找(类似上面故事中的名单册一样)。

      - 这种以空间换时间的方式,在大部分情况下是可行的。

      - 但是在面对很大数据量的时候,存储量/检索时间 都会变得难以控制

      - 布隆过滤器(Bloom-Filter) 就是为了解决这种情况,消耗小的空间/时间,来检索数据

    二:什么是布隆过滤器(Bloom-Filter)

      - 布隆过滤器(英语:Bloom Filter)是1970年由布隆提出的。

      - 它实际上是一个很长的二进制向量和一系列随机映射函数

      - 布隆过滤器可以用于检索一个元素是否在一个集合中。

      - 它的优点是空间效率和查询时间都远远超过一般的算法。

      - 缺点是有一定的误识别率和删除困难。

    三:原理

      - 布隆过滤器的原理是,当一个元素被加入集合时,通过K个散列函数将这个元素映射成一个位数组中的K个点(特征),把它们置为1。

      - 检索时,我们只要看看这些点是不是都是1就(大约)知道集合中有没有它了:如果这些点有任何一个0,则被检元素一定不在;

      - 如果都是1,则被检元素很可能在。  

      - 这就是布隆过滤器的基本思想。

      - 

    四:缺点

      - 存在误判

        - 可能冲突,就像两个人的特性很相似一样

      - 删除困难

        - 一个放入容器的元素映射到bit数组的k个位置上是1,删除的时候不能简单的直接置为0,可能会影响其他元素的判断。 

    五:参考

      - 大数据量下的集合过滤—Bloom Filter

  • 相关阅读:
    .NET中栈和堆的比较 #1
    Asp Interview Questions and Answers
    c#缓存介绍(转)
    [转]Post和Get的区别(兼谈页面间传值的方式)
    .NET垃圾回收机制 转
    zoj 3008 3010
    zoj 2912 Average distance
    TinyMCE,强大的网页编辑器插件
    zoj 3587 Marlon's String
    SOJ和FOJ的比赛
  • 原文地址:https://www.cnblogs.com/25-lH/p/10695225.html
Copyright © 2011-2022 走看看