每个程序员都应该掌握的数据结构 – Bloom Filter

Bloom Filter

这种数据结构的名字来源于他的发明人Burton Howard Bloom的名字,凡是用自己名字命名的东西一般都非常牛逼,思维精巧,独步武林。

Bloom Filter跟hash有着紧密的关联。首先设想我们有一个比较大的数据集合,每一条记录有一个key,现在有一个需求是问给定一个key,这个集合包含不包含这个数据?我们不太可能不假思索的把整个数据集合load进内存中,因为可能存在多个这样的数据集合。最容易想到也最直接的想法是在内存中构造一个hash的结构保存所有已经存在的key,这其实已经能够解决绝大多数的问题了,但是有没有更好的呢?乍一看对普通人来说不太容易找到突破口,这确实需要非凡的智慧来打破定式思维。Bloom Filter就设计了这样一种思路,它找到了一种折中,以一定概率的错误回答来实现比常规hash表小的多的内存使用量。直白的来说就是当我们问数据集包含不包含key的数据的时候,如果它回答不包含,那100%数据集不包含,但是如果它回答包含的话,却不是一个确定的答案,我们需要进一步的策略去确定它是不是真的包含,牛逼的地方在于这个出错的概率我们是自己可以控制的。

让我们先从一个很笨的但是朴素的方法开始,假设我们知道数据集有1000万条数据,如果我们设计一种很差的hash算法,使得这1000万条数据只有1万个hash值,常规的hash表用链表的结构解决hash冲突的问题,所以即使只有1万个hash值,如果我们用常规的hash表来保存所有key在内存中的话,内存仍然是1000万个key的大小,如果我们的数据结构不解决hash冲突呢?只load这1万个hash值在内存中,那么当有询问一个key在不在这个集合中的时候,很明显如果hash(k)不在这1万个值中,那么这个key一定不在这个数据集合中,hash(k)在的话,那么有可能是包含这个key的,因为我们没解决hash冲突,很明显的直觉告诉我们hash值越多,回答出错的概率就会越低,但是如果沿着这个思路下去的话,我们依然会陷入死胡同,因为你的hash函数越完美,就越需要更多的内存来保存hash值。

让我们再次回到一个基本认知逻辑中,现实生活中,我们经常看到一些娱乐节目玩一种你说我猜的游戏,就是给定一个物品,一个人去描述它的特征,另一个人来回答它是什么,一种食物,圆的,中秋节吃的,那么很容易猜到是月饼,我们模仿这种思路用一组hash函数hash1,hash2 …来为一个key算出一组hash值,然后用一种有效的数据结构来保存这组hash值,当再有询问一个key在不在的时候,我们同时判断hash1(key),hash2(key)…都在不在已经我们的的数据结构里来回答这个key在不在,我们依然依靠直觉这样的判断应该出错的几率会降低了,谈到有效的,内存敏感的,数相关的数据结构我们应该马上会回想到bitset,Bloom Filter正是依赖着这种数据结构来存储所有的hash值,每个hash(key)都对应着一个bit位。

现在让我们更准确的定义这种数据结构,给定n个元素的集合,k个hash函数,m大小bitset来存储所有的hash值,使得当询问一个key是否在集合中的时候以确定的概率p回答错误。以下只包含经过了严格的数学证明的结论,我们程序员可以直接拿来使用。

n和p是我们可以决定的,当我们选定这两个参数以后,下列公式可以帮我们确定m,

根据概率确定m

当m确定后,我们用下列公式确定k,


根据m和n确定k

当这些变量都确定后,我们需要去设计一组hash函数,我们可以直接拿算法导论Designing a universal class of hash functions章节去实现我们的k个hash函数。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,186评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,858评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 158,620评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,888评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,009评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,149评论 1 291
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,204评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,956评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,385评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,698评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,863评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,544评论 4 335
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,185评论 3 317
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,899评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,141评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,684评论 2 362
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,750评论 2 351

推荐阅读更多精彩内容

  • 教你如何迅速秒杀掉:99%的海量数据处理面试题 本文经过大量细致的优化后,收录于我的新书《编程之法》第六章中,新书...
    Helen_Cat阅读 7,410评论 1 39
  • 第一章 Nginx简介 Nginx是什么 没有听过Nginx?那么一定听过它的“同行”Apache吧!Ngi...
    JokerW阅读 32,654评论 24 1,002
  • 第一部分、十道海量数据处理面试题 1、海量日志数据,提取出某日访问百度次数最多的那个IP。 此题,在我之前的一篇文...
    零一间阅读 917评论 0 5
  • 海量数据处理,就是在海量数据上的存储、处理、操作。海量的意思就是数据量太大,所以导致要么是无法在较短时间内迅速解决...
    seriously_1阅读 1,166评论 0 1
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 简书 有时候需要知道某个设备上还有多少磁盘空...
    SnailTyan阅读 641评论 0 1