没有误报的概率集?


35

因此,Bloom过滤器非常酷-它们是支持成员资格检查的集,没有错误否定,但很少有错误肯定的机会。不过最近,我一直想要一种“布隆过滤器”,它可以保证相反的结果:没有误报,但可能有误报。

我的动机很简单:鉴于有大量要处理的项目(包含重复项),我们希望避免处理以前见过的项目。处理重复副本没有什么坏处,只是浪费时间。但是,如果我们忽略处理元素,那将是灾难性的。使用“反向布隆过滤器”,可以以很小的空间开销存储看到的项目,并通过测试集合中的成员资格来避免以高概率处理重复项。

但是我似乎找不到任何东西。我找到的最接近的是“ 修饰过的Bloom过滤器 ”,它可以使选定的误报以较高的误报率进行交易。但是,当我想删除所有误报时,我不知道其数据结构的性能如何。

有人看到过这样的东西吗?:)


3
我感兴趣的集合的补数是无限的。我将如何存储它?
Christopher Monsanto

11
我看到了问题(现代磁盘还不够大)。
戴夫·克拉克

8
如果您具有这样的数据结构,则可以将其与常规布隆过滤器结合使用,从而“欺骗”并存储确切的集合成员身份。
2011年

1
@MarkReitblatt Bloom过滤器和缓存均是概率性的,并且它们的任何组合都将是概率性的,即无法实现精确的集合成员资格测试。:)
awdz9nld

Answers:


25

一个答案是使用一个大的哈希表,当表填满后,开始替换其中的元素,而不是在其他地方查找(不存在)空插槽。您不会像使用Bloom过滤器那样获得固定的错误答案固定比率,但是总比没有好。我认为这是标准的,例如在国际象棋软件中,用于跟踪已经搜索过的位置。


感谢您的回答。是的,这是显而易见的解决方案-如果它也是标准解决方案,听起来我很不走运。那好吧。
克里斯托弗·孟山都

2
这称为直接映射缓存,通常在CPU中使用。(任何缓存或有损哈希集都可以在不同程度上满足要求)。错误率是哈希函数分布(雪崩)和高速缓存/集中可用插槽数量的函数-相应地进行调整。:)
awdz9nld 2012年

还要注意,只能存储逐字键,而不会引入误报(例如,存储散列键)
awdz9nld 2012年

20

这个问题的答案是“否”。要知道为什么,我们可以考虑一个非常极端的情况,以及常规的bloom过滤器与理论上称为“ glosha过滤器”的“ Bizzaro World” bloom过滤器如何工作。

Bloom过滤器的优点在于,您可以使用数据结构进行单方面测试(带有误报),以对错误的可能性和存储的项目进行固定设置。项目本身的大小根本不重要。例如,如果我们设置了布隆过滤器,最多可存储1,000个项目,且错误率小于3%,那么我们可以存储整个Wikipedia语料库的1,000个略有不同的版本,每个版本中只更改一个字母,我们仍然得到我们想要的指标,数据结构将非常小(小于一千字节)。当然,计算这些哈希值将是一个挑战,但是原理仍然成立。

现在,考虑将相同的大量字符串存储在gloom过滤器中!现在我们只能有假阴性。因此,如果我们说“是的,那么整个百科全书的版本都在这个集合中”,那么我们对此必须绝对正确。这意味着散列将无济于事,因为总会有一些其他字符串散列为相同的值。唯一可以肯定地说的方法是存储整个字符串或相同长度的一些等效数据。我们总是不能存储它并说“ no”,但是最终错误率将赶上我们。我们所能做的最好的事情就是压缩,将结构的大小减小到存储的数据熵与所需精度之间的乘积。

因此,不幸的是不存在暗淡滤镜。缓存是唯一的解决方案,但实际上并不是Bloom过滤器的对立面,因为它的大小将与存储的信息量和过滤器的期望准确率的乘积成正比。当然,在许多实际场景中,大数据可以用ID表示,因此缓存仍然是可以接受的。但这与强大的Bloom filter根本不同。



@Yehosef很好,可以满足您的需求,但是您会注意到作者谈论“完全识别事件的少数ID”。因此,所实现的实际上仍然是存储整个对象。因此,它是缓存的一种变体。真实的“与布隆过滤器相反”(如果存在)将不需要存储整个对象。
pents90

他提到了一些标识事件的ID,而不是整个对象。我只需要在session_id上保留“缓存”,而不是整个交互记录。但是我听说这与绽放或超日志的方法不同。
Yehosef 2015年

在您的“证明”中,您假设存在无限数量的可能条目。但是,在某些情况下,可能的条目集是事先已知的。例如,对于内存页的垃圾回收:您知道它包含哪些条目。现在,您创建一个“ gloom filter”,将每个可能的条目映射到索引0..n。现在,当删除一个条目时,将该位设置为该索引。设置完所有位后,您可以垃圾回收页面。“阴暗滤波器”是MPHF。为了允许出现假阴性,请更改MPHF,以使某些条目映射到n + 1。
Thomas Mueller

@ThomasMueller正确,我假设是最坏情况/对抗情况,这是标准CS理论的观点。的确,如果您只有一组固定的N个可能的条目,那么有很多简单的解决方案,每个项目只需要记录N个空间。布隆过滤器没有这种限制。
pents90

13

您只需要一个缓存,但正在以一种奇怪的方式考虑它。


1
...想详细说明吗?缓存当然可以工作,但这不是理想的选择,因此存在关于概率数据结构最新技术的问题。更具体地说:我知道的缓存技术需要大量存储。高速缓存级别越多,使用的存储空间越多。可以对存储在缓存中的元素进行限制,使用用法进行欺骗等,但是仍然无法达到Bloom过滤器提供的空间效率与错误答案比率之间的任何距离。
克里斯托弗·孟山都

1
(续)话虽如此,我可能会忘记一种可以解决我所有问题的显而易见的缓存技术。在那种情况下,您可以明确说明该技术,而不是给我链接到Wikipedia上的常规类别?
Christopher Monsanto

2

免责声明:我不是缓存专家,因此这可能是一个幼稚的想法,也可能是一个我从未听说过的已知想法。因此,如果我没有引用它的引用(如果存在),请原谅。如果有参考资料可以编辑帖子并添加,请通知我。(我怀疑它可能有参考,因为它是如此直观)。

cc


0

我使用了带有部分项目的AVL(有时是红黑色)树作为没有假阴性的过滤器。插入或查询树时,仅使用项目的前X个字节。因为数据结构的形式不是概率性的,所以不存在因位冲突而导致假阳性的风险。与缓存整个项目不同,此方法可为您提供可计算的最大空间。您可以通过考虑不同的前缀长度/树深度(与误报和空间成本相比)来调整误报率。


我也想尝试使用字符串数据,但是我的数据倾向于打包为二进制结构。
JRideout 2011年

0

我认为可以证明上述数据结构不存在的下界。基本上,如果数据结构使用m位,则固定的位向量(输入的表示形式)最多可以对应一个计数参数设置的(((un)+ n eps)\ choose(un))集。假设这个数字的2 ^ m倍必须至少(u \ choose n)(必须表示所有集合),我们得到一个下界,基本上与精确存储集合S非常接近。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.