Python快速重复检测,我可以只存储哈希而不存储值



我有一种创建图像"哈希"的方法,它对重复帧检测很有用。(这对问题来说并不重要(

目前,我把视频的每一帧都放在一个集合中,可以通过比较集合来找到包含交集的视频。(我有数十亿个散列(

由于我有自己的"hash",所以我不需要集合的值,只需要检测重复项的能力。

这将使我的内存占用减少一半(因为我只有散列(。

我知道在内部一个集合实际上是散列值对。必须有一种方法来创建"SparseSet"或"hashonly"集。

类似的东西

2 in sparset(1,2,3) 
True

但是

for s in sparset(1,2,3)

将不返回任何内容,或者哈希值不是值。

这不是集合的工作方式。散列值和值都是必需的,因为在散列冲突的情况下,必须检查这些值是否相等。

如果不关心碰撞,可以使用Bloom过滤器而不是集合。这些都是非常有记忆效率的,但给出了概率性的答案(要么肯定不在集合中,要么可能在集合中(。标准库中没有Bloom过滤器,但PyPI上有几个实现。

如果你更关心优化空间而不是时间,你可以把散列放在一个列表中,然后当你需要检查一个元素时,把它排序在适当的位置,然后进行二进制搜索。当列表大部分已经排序时,Python的Timsort非常高效,因此后续排序将相对较快。Python列表有一个sort()方法,使用标准库bisect模块可以很容易地实现二进制搜索。

您可以将这两种技术结合起来,即如果Bloom过滤器指示元素不在集合中,则无需进行排序。当然,如果自上次以来还没有添加任何元素,就不用再麻烦排序了。

最新更新