目录
位图
假设现在有40亿个不重复无符号整形的数据需要被处理,并且没有排过序,给你一个无符号整数,如何才能判断出在不在的情况。那么我们现在有3种选择。
1:遍历:时间复杂度O(N)
2:排序O(NLogN),利用二分查找,LogN
3:位图
如果使用第一种的话,40亿个整形数据,每个整形4个字节,就大概需要将近16G的内存,一台普通家用电脑可能也才16G,那么说只跑这个程序就需要占掉电脑的所有资源,显然是行不通的,那么第一种行不通第二种当然也无法解决这个问题了。只有来看第三种。
我们试想一下,数据无非就在与不在两种情况,那么我们是否可以用一个bit位来表示。如果二进制bit位位1我们表示这个数据存在,如果位0就表示不存在。那么,在面对海量数据的时候也是可以完美解决的。
同样,假设给我们100亿个int,但是现在我们只有一个G的内存,现在需要将出现不超过两次的数据给筛选出来也可以使用位图来解决。一个bit位可以标识在与不在的状态显然已经无法满足当下的情况,但是两个bit位就可以表示多种状态,我们可以使用
00表示数不存在
01表示出现一次
10表示出现2次
11表示出现多次
布隆过滤器
我们在使用新闻客户端看新闻时,它会给我们不停地推荐新的内容,它每次推荐时要去重,去掉
那些已经看过的内容。问题来了,新闻客户端推荐系统如何实现推送去重的? 用服务器记录了用
户看过的所有历史记录,当推荐系统推荐新闻时会从每个用户的历史记录里进行筛选,过滤掉那
些已经存在的记录。 如何快速查找呢?
如果使用哈希来存储用户的记录太过于浪费空间
位图一般只能处理整形,如果内容是字符串编码就无法处理
那么此时,位图+哈希的结合,布隆过滤器就诞生了。
布隆过滤器是由布隆(Burton Howard Bloom)在1970年提出的 一种紧凑型的、比较巧妙的概
率型数据结构,特点是高效地插入和查询,可以用来告诉你某种东西一定不存在或者可能存在,它是犹多个哈希函数,将一个数据映射到多个位置。
在的情况-->存在误判:
将一个公司的名字映射到多个位置,如果这几个位置都存在,那么就说这个公司的名字存在,但是也有可能误判,因为这三个位置可能恰巧同时都被映射到了。但是概率是相对于只映射一个位置较低的。
一定不在情况:
如果我现在有一家新公司要注册,但是不知道这个名字有没有被注册,那么我们就可以去这个名字对应的三个位置去查找,只要有一个位置的状态是0,那么就说明这个名字一定没有被注册,因为被注册过的一定是三个位置都位真的状态。
在现实生活中,布隆过滤器适用于哪些情况呢。当我们去游戏中注册一个名字的时候,系统需要快速的判断在与不在,相当于就是去对应的三个位置查找,如果只要有一个位置为0,那么就可以快速做出反馈给用于可以注册。如果在,则需要去数据库中存在这个名字是否真的存在,这样就大大提高了在数据库中查找的效率。