所以我理解bitset向量本质上可以为每个位存储真/假集,但是我对它和bloom过滤器之间的区别感到困惑,我理解bloom过滤器使用散列函数并且可以返回误报,但他们可以存储的数据类型或功能的实际差异是什么?
答案 0 :(得分:1)
位集向量只是一个任意位数的大字段,可以使用它们的索引单独设置。
布隆过滤器是一种集合(不包含数据本身),允许快速决定元素是否包含在集合中。在某种bitset向量的顶层上构建,在插入元素时将后者的几个位设置为1或读取它们以检查是否包含元素(不允许您直接访问它)基础bitset vector)。
答案 1 :(得分:0)
可以使用位集来实现Bloom过滤器,但是不能使用Bloom过滤器来实现位集合。
答案 2 :(得分:0)
(我知道这是一篇旧文章,但无论如何还是为以后的读者发布。)
将位集认为是布尔数组的无损压缩 假设您必须在集合中存储32个布尔值。 您的直觉是使用数组或布尔值列表 假设该数组中的每个项目都需要一个字节的空间,所以该数组总计为32个字节 但是您会看到,每个项目都是一个字节,所以它是8位。 尽管仅1位就可以说对还是错,但您为该项目使用了8位。 由于有32个字节,因此最终使用32 * 8 = 256位。 然后问题出现了,“为什么我们不使用单个32位数字在对应于这32个项目的每一位中存储1或0?” 那不过是一个位集-您将只使用32位而不是256位来存储相同的信息。在这里,您可以通过检查项目的相应位位置来确定其是否存在。这种存储可以为任何地方提供帮助,特别是在嵌入式系统中的内存密集型代码,每秒执行大量图形/数学运算的高端游戏以及机器学习中的特定应用程序中。
将Bloom过滤器视为布尔数组的有损压缩或位集的有损压缩-取决于要实现的基础数据结构。 在这里,它是有损的,因为您永远无法知道给定的项目是否存在,但是您绝对可以说它是否不存在! 它使用哈希函数将给定输入的位集中的某些位设置为1 。对于另一个输入,将设置其他一些位。 问题是,可以为两个不同的输入设置通用位。因此,由于可能会基于多个项目设置公共位,因此无法确定是否存在某个项目。但是,即使未为给定输入设置单个位,也可以肯定地说不存在。这就是为什么我称这种有损。
希望这就是您想要的。