Bloom过滤器从O(n)中的整数流中删除重复项

时间:2013-10-09 06:44:10

标签: java algorithm

如何创建一个布隆过滤器,以便在O(n)时间复杂度和时间上从整数流中删除重复元素。 O(1)空间复杂度? 如果可能的话,如果有人能指出我正确的方向,我将不胜感激?

2 个答案:

答案 0 :(得分:4)

我很确定它只是:

对于每个元素:

  • 检查布隆过滤器中是否存在,如果存在,则可能是重复的
  • 将其插入bloom过滤器

现在有两个问题:

  • 存在误报的可能性
  • 这不是真正的O(1)空间(但有些人可能会说),因为大小需要在某种程度上取决于(唯一)元素的数量,否则,随着我们增加数量,错误率将显着增加元素。

我不相信这些问题中的任何一个都可以通过约束来避免 - 两者都是使用(仅)布隆过滤器的组成部分。

如果我们不是处理流,而是处理列表,我们可以通过记录由bloom过滤器拾取的所有元素来排除误报,并再次通过列表检查我们的候选列表而不是确保它们是实际重复的。这仍然是O(n)时间,但显然不是O(1)空间。

答案 1 :(得分:1)

Google Guava提供了bloom过滤器实现。

请注意,布隆过滤器本身是不够的。如果布隆过滤器声称某个数字不在其中,那么它就不在其中。但如果它声称这个数字已经存在,那么它就有可能出错。所以你需要在那里有另一个数据结构,并使用bloomfilter来减少该数据结构中的查找次数。