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

时间:2018-07-22 22:41:31

标签: python hash duplicates set sparse-matrix

我有一种创建图像“哈希”的方法,该方法可用于重复帧检测。 (这个问题并不重要)

目前,我将视频的每个帧放在集合中,并且可以通过比较集合来执行查找包含交集的视频之类的操作。 (我有数十亿个哈希)

由于我有自己的“哈希”,因此不需要集合的值,而仅需要检测重复项的功能。

这将使我的内存占用减少一半左右(因为我只有哈希)。

我内部知道一个集合实际上是哈希值对。必须有一种设置“ SparseSet”或“ hashonly”的方法。

类似

2 in sparset(1,2,3) 

True

但是在哪里

for s in sparset(1,2,3)

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

1 个答案:

答案 0 :(得分:1)

这不是相当设置的工作原理。哈希值和该值都是必需的,因为在发生哈希冲突的情况下必须检查这些值的相等性。

如果您不关心冲突,则可以使用Bloom filter而不是集合。这些都是非常有效的内存,但是给出了概率答案(肯定不在集合中,或者可能不在集合中)。标准库中没有Bloom过滤器,但是PyPI上有几种实现。

如果您更关心优化空间而不是时间,则可以将哈希值保留在列表中,然后在需要检查元素时,将其排序并进行二进制搜索。当列表大部分已经排序时,Python的Timsort效率很高,因此后续排序将相对较快。 Python列表具有sort()方法,您可以使用标准库bisect模块轻松地执行二进制搜索。

您可以结合使用这两种技术,即,如果Bloom过滤器指示元素不在集合中,请不要理会排序。而且,如果您自上次以来未添加任何元素,请不要再麻烦排序。