【发布时间】:2022-01-11 22:48:15
【问题描述】:
我有大量的字符串列表。每个字符串都比较短,可能大约 64 个字符,但整个列表占用大约 8GB 的磁盘空间。我需要以编程方式测试此列表是否包含任何重复的字符串,并且理想情况下,输出所有重复项;我需要尽快完成这项工作。
将所有字符串加载到 hashtable/HashSet/Dictionary 的通常解决方案显然行不通,因为我不能浪费 8GB 的 RAM(而且它无论如何也行不通,因为可能没有连续的块长足够的)。我可以使用一些更智能的算法吗?我希望这个列表在大多数情况下只包含唯一的字符串,所以也许我可以使用布隆过滤器作为第一遍;但万一发生碰撞,我仍然需要找到实际的重复项。
【问题讨论】:
-
你有多少内存?将哈希存储到存储桶中,以便您负担得起一个存储桶的大小。
-
您可以执行两次传递:一次生成 Bloom 过滤器,另一次处理冲突。
-
@stark 你应该从你的评论中做出回答。听起来是一个非常好的候选解决方案。
-
@stark:是的,但这基本上是我已经在使用的过程。正如我在帖子的最后一句中所说,如果 Bloom 过滤器报告冲突,我别无选择,只能执行第二遍。
标签: list algorithm performance unique