检查元素是不是属于集合的算法
Posted
技术标签:
【中文标题】检查元素是不是属于集合的算法【英文标题】:Algorithm to check if an element is part of a set检查元素是否属于集合的算法 【发布时间】:2021-08-24 10:14:52 【问题描述】:我有一个元素列表,我想将这些元素散列在一起以获得根散列(类似于 merkle 树)。要求是我需要验证根哈希中是否存在元素。现在的限制是,我只能访问根哈希和我们需要在任何时间点验证的元素,因此我们将无法使用默克尔树方法。尝试过布隆过滤器和类似的算法,但找不到处理误报的方法。有没有我可以遵循的数据结构或算法来获得解决方案?
【问题讨论】:
如果你只有哈希值,总是有可能发生冲突。 是的。充分意识到这一点,只是寻找解决这个问题的可能性,忽略碰撞 只有一层的默克尔树如何违反您的约束? 您能详细说明一下吗?我可以在集合中包含超过 2 个元素。 是否允许缓存值? 【参考方案1】:最后您的问题可以通过Kolmogorov complexity 来回答。您的浓缩问题是您的特定集合的最大压缩。
改写答案:在您的问题上没有更多entropy(请参阅香农/吉布斯),您需要放弃其中一个:准确性或空间。如果您有一个非常具体的问题,可能会有更好的解决方案,因为熵不同(例如,最大不同元素、大小限制、重复出现的模式、前缀......)。
命名算法 (Bloomfilter) 旨在针对另一方的成本进行优化(简单地说:如果概率低于被闪电击中的概率或CPU 本身崩溃或地球被小行星撞击,...)。您可以使用collision calculator 预先计算预期的碰撞概率。
因此,一个 64KiB 的布隆过滤器将能够在被闪电击中之前存储多达 20.637 个元素。您可以使用以下参数: https://hur.st/bloomfilter/?n=&p=0.5E-5&m=64KiB&k=
如果您不希望发生任何冲突,则以哈希开头是错误的方式。一旦信息丢失,它将一直丢失。然后,您应该考虑以不同的方式压缩集合。为了最好地优化此操作,需要有关数据的知识来提供帮助。
如果你不愿意(或不能)放弃某些东西,那么你就是在谈论带有lossless compression 的系列。 Shannon's source coding theorem告诉您无损压缩在理论上可以达到何种最佳效果,以及您与最佳效果相比有多好。如果您谈论整数,则在一些论文中讨论了一些整数序列压缩算法here in ***
【讨论】:
以上是关于检查元素是不是属于集合的算法的主要内容,如果未能解决你的问题,请参考以下文章