位图、分治和布隆过滤器

引子


给定 40 亿个不重复的没排过序的 unsigned int 型整数,然后再给定一个数,如何快速判断这个数是否在这 40 亿个整数当中?

位图


bitmap:就是用一个或多个 bit 来标记某个元素对应的值,而键就是该元素。采用位作为单位来存储数据,可以大大节省存储空间。

解决40亿个整数中的是否存在某个数字可以使用位图。

思路:建立长度为40亿的位数组,遍历这40亿个数字,假设数字为5,那么将位数组中数组下标为5的位改为1,如果数组中下标为5的位已经是1,那么不操作。假设当给定数字为7,当位数组下标为0时说明不存在,当位数组下标为1时说明已经存在。

分治法


基于分治法也可解决这个问题。

思路:将40亿个数字根据哈希映射,映射到多个小文件中。再把给定的数字也进行哈希映射,映射到那个文件就在那个文件中查找这个数字是否存在。

如,对40亿个数字按一千万取模,这个会得到400个小文件:a0、a1、a2、a3、…a399,假设给定的数字为256,那么应该查找文件a256是否存在这个数字。

布隆过滤器


通过位图,可以实现布隆过滤器。
布隆过滤器是由二进制向量(或者说位数组)和一系列随机映射函数(哈希函数)两部分组成的数据结构。
布隆过滤器可以判断一个字符一定不存在或者可能存在。当判断一个字符可能存在,但实际上这个字符并不存在。

布隆过滤器可以解决缓存穿透问题:将数据库中存在的数据放到Redis中的布隆过滤器中,当查询的数据在Redis中布隆过滤器不存在时,说明此次查询是无效的(绕过缓存直接查询数据库

还可以用于去重,比如爬虫判断网址是否已经爬取过。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章