返回

面试官别再问「布隆」了!

见解分享

身为工程师,在面试的时候经常会遇到各种各样的算法题,而其中有一道题特别让人头疼,那就是「布隆」。这道题的具体内容是这样的:

现有一个网站,其黑名单中存储了 100 亿个 URL,每个 URL 的长度平均为 64 字节。试问,我们该如何将这个黑名单存储起来?另外,如果我们现在随机输入一个 URL,又该如何快速判断该 URL 是否存在于这个黑名单中?

对于初次接触这道题的人来说,很可能会感到不知所措。不过,只要我们掌握了布隆过滤器的概念和原理,其实这道题并没有那么难。

什么是布隆过滤器?

布隆过滤器是一种空间高效的概率型数据结构,它可以用来判断一个元素是否属于某个集合。布隆过滤器的工作原理非常简单:它使用一个二进制位数组来表示集合中的元素,并且通过多个独立的哈希函数将每个元素映射到这个数组中的若干个位置上。

当我们要判断某个元素是否属于集合时,我们只需要将该元素通过相同的哈希函数映射到数组中的位置上,然后检查这些位置上的比特位是否都为 1。如果所有比特位都为 1,那么该元素一定属于集合;如果有一个或多个比特位为 0,那么该元素一定不属于集合。

布隆过滤器的优点在于,它可以在非常小的空间内存储大量的数据,并且判断元素是否属于集合的时间复杂度为 O(1)。然而,布隆过滤器也存在一个缺点,那就是它可能会出现误判的情况,即它可能会错误地认为某个元素属于集合,而实际上该元素并不属于集合。

布隆过滤器如何应用于这道面试题?

在面试题中,我们被要求将 100 亿个 URL 存储在一个黑名单中,并且要能够快速判断某个 URL 是否存在于这个黑名单中。此时,我们可以使用布隆过滤器来解决这个问题。

首先,我们需要创建一个足够大的二进制位数组,以便能够容纳 100 亿个 URL。然后,我们将每个 URL 通过多个独立的哈希函数映射到这个数组中的若干个位置上。

当我们需要判断某个 URL 是否存在于黑名单中时,我们只需要将该 URL 通过相同的哈希函数映射到数组中的位置上,然后检查这些位置上的比特位是否都为 1。如果所有比特位都为 1,那么该 URL 一定存在于黑名单中;如果有一个或多个比特位为 0,那么该 URL 一定不存在于黑名单中。

布隆过滤器与哈希表和位图的区别

布隆过滤器与哈希表和位图都是空间高效的数据结构,但它们之间存在一些关键的区别。

哈希表是一种键值对的数据结构,它可以通过键来快速查找对应的值。布隆过滤器与哈希表的主要区别在于,布隆过滤器不能通过键来查找值,它只能判断某个元素是否属于集合。

位图是一种二进制位数组,它可以用来表示一组元素的状态。布隆过滤器与位图的主要区别在于,布隆过滤器可以存储大量的数据,而位图只能存储有限数量的数据。

结语

布隆过滤器是一种非常实用的数据结构,它可以在实际场景中解决许多问题。在面试中,如果遇到与布隆过滤器相关的问题,也不要惊慌失措。只要我们掌握了布隆过滤器的概念和原理,就能够轻松应对这些问题。