引子
给定 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中布隆过滤器不存在时,说明此次查询是无效的(绕过缓存直接查询数据库)
还可以用于去重,比如爬虫判断网址是否已经爬取过。
来源:CSDN
作者:vio_dzyls
链接:https://blog.csdn.net/qq_33423418/article/details/104724868