当我们处理非常大的数据时,什么时候使用Bloom filter,什么时候使用BitMap?

luc*_*umt 2 algorithm bit bloom-filter bitset

我正在学习Bloom filterBitMap(也称为Bit Array)并遇到一个问题,有人能给我一些关于何时使用布隆过滤器以及何时使用 BitMap 的说明吗?

在我的理解中我认为当我们需要找到最大的数字或者想要对庞大的数据进行排序时,BitMap 更适合(对于纯数字)。

如果我们想检查一些IP地址是否包含在数十亿条现有记录中,那么布隆过滤器更适合(用于字符串或其他非纯数字)。

但是,我想有人给我更详细的说明或建议,我在谷歌上搜索过,没有找到一些有用的信息。提前致谢!

另外我不知道我是否应该将这个问题放在stackoverflow或其他站点上,如果它不是正确的站点,希望有人指出,谢谢!

Tho*_*ler 5

何时使用布隆过滤器:如果您有一个集合(一个唯一条目列表)和一个散列函数,您可以创建一个布隆过滤器。它允许“条目 x 可能在集合中吗?”类型的查询。如果条目在集合中,查询将返回真。对于不在集合中的条目,它可能以较低的概率返回 true,通常为 1% 或更低(取决于布隆过滤器的大小)。您可以将布隆过滤器设置得尽可能小,但对于大约 1% 的误报率,每个条目需要大约 10 位。有使用较少空间的替代算法/数据结构,请参见例如https://github.com/FastFilter。顺便说一下,布隆过滤器在内部使用了一个位数组。

何时使用位数组(也称为位集):如果条目是 0..n 之间的数字,那么您可以按如下方式使用位数组:为每个条目设置位 x。这将需要 n 位(无论有多少条目)。因此,如果您的条目可以是大数字,那么就有一个问题:它将使用大量内存。但是,您可以创建一个稀疏位数组(也称为压缩位数组),例如使用https://roaringbitmap.org/。您不会像布隆过滤器那样出现误报,但大小的使用在很大程度上取决于您的数据(取决于您拥有的数字),这比布隆过滤器要重要得多。