散列表之布隆过滤器

散列表概念
散列表又名(hash表)是根据关键码值(Key value)而直接进行访问的数据结构。也就是说,它通过把关键码值映射到表中一个位置来访问记录,以加快查找的速度。这个映射函数叫做散列函数,存放记录的数组叫做散列表。
给定表M,存在函数f(key),对任意给定的关键字值key,代入函数后若能得到包含该关键字的记录在表中的地址,则称表M为哈希(Hash)表,函数f(key)为哈希(Hash) 函数。

在这里插入图片描述

布隆过滤器(适用于大数据量中某个元素存在与否的问题):
布隆过滤器(Bloom Filter)是1970年由布隆提出的。它实际上是一个很长的二进制向量和一系列随机映射函数。布隆过滤器可以用于检索一个元素是否在一个集合中。它的优点是空间效率和查询时间都比一般的算法要好的多,缺点是有一定的误识别率和删除困难。
基本思想:
它可以通过一个Hash函数将一个元素映射成类似数组结构中的一个位阵列(Bit array)中的一个点。如果存在就把这个位阵列中的值置为1.这样一来,我们只要看看这个点是不是1就可以知道集合中有没有它了。这就是布隆过滤器的基本思想。

劣势:误判
分析:查询效率高是因为采用hash 等映射的方式基本判断元素存在集合中。误判是因为,不同的值通过一个相同的映射函数可能映射到相同的值。判断元素存在集合中出现误判。

优势:
数据结构选用一个位二进制(1B),可以非常节省空间。以为他的值只存在一个位中所以可以存的值非常多,可以进行大数据量的判断数据存在与否。相比于其它的数据结构,布隆过滤器在空间和时间方面都有巨大的优势。布隆过滤器存储空间和插入/查询时间都是常数。另外, Hash函数相互之间没有关系,方便由硬件并行实现。布隆过滤器不需要存储元素本身,在某些对保密要求非常严格的场合有优势。
布隆过滤器可以表示全集,其它任何数据结构都不能。

减少误判的方法:
就是使用多个Hash,如果它们有一个说元素不在集合中,那肯定就不在。如果它们都说在,虽然也有一定可能性它们在说谎,通过另一个hash 函数映射看是否存在这个值。从而减少误判的几率。

下面是多个hash 映射 同一个值的图例
在这里插入图片描述

bitmap:(todo 需要验证和更加深入的去理解)
可能有人会想,Bitmap在处理海量数据时,有着得天独厚的优势,占用内存非常小(每一个数据只占1个bit),即使在处理url、邮件地址等其他类型的数据时,要把字符串变换为整数,也有各式各样的方法。那么我们为什么不用Bitmap来判重而要用布隆过滤器呢?

首先,我们来看,Bitmap的存储空间计算方式是:找到所有元素里面最大的(假设为N),Bitmap所需空间S为:
S=N8Byte
S=N8Byte
当N为64位整数时,最大的N为2^64,此时S为 2^61 Byte,也就是 2^41 MB,可以说是一个天文数字了……Bitmap的长处非常令人愉悦:空间不随集合内元素个数的增加而增加。但是不足之处也同样明显:空间随集合内最大元素的增大而增大。

比如:在爬虫避免重复下载处理时,若网站数量很多的情况下,用一个64位,甚至是128位的整数来标识URL是家常便饭。此时如果使用bitmap的话,无疑是不明智的。而选择布隆过滤器,由于其可能一个bit为多个元素做标识,这就保证了它的空间利用率。

bitmap 更加适合数字比较:
比如比较两个数组是否有重叠,我们把第一个数组中的1,2,5,7,11分别映射到bitmap位置中

在这里插入图片描述

其他数组只需要把值当成索引号去bitmap中查看是否值=1
-确定就是假如我是 1,100000000,那么其实只需要用到2位,但是却需要100000000位内存
由此我们确定了布隆过滤
布隆过滤器适合非数字比较(有误判)

当一个元素被加入集合时,通过 K 个 Hash函数将这个元素映射成一个位阵列(Bit array)中的 K 个点,把它们置为 1
也就是说一个数据可能占用多个bit,hash函数越多误判越少 但是消耗内存越多

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值