java - 需要内存有效的方式来存储大量字符串(是 : HAT-Trie implementation in java)

标签 java data-structures hash trie bloom-filter

我正在使用大量 (5-20​​ 百万) 字符串键 (平均长度 10 个字符),我需要将它们存储在内存数据结构中支持在恒定时间或接近恒定时间内进行以下操作:

// Returns true if the input is present in the container, false otherwise
public boolean contains(String input)

事实证明,就吞吐量而言,Java 的 Hashmap 非常令人满意,但它占用了大量内存。我正在寻找一种内存高效的解决方案,并且仍然支持不错的吞吐量(与散列相当或几乎一样好)。

我不关心插入/删除时间。在我的应用程序中,我将只执行插入操作(仅在启动时),随后将只在应用程序的生命周期内使用 contains 方法查询数据结构。

我读到 HAT-Trie 数据结构最适合我的需要。我想知道是否有一个有实现的库。

欢迎提供其他带有实现指针的建议。

谢谢。

最佳答案

trie 对于您的约束来说似乎是一个非常好的主意。

“跳出框框思考”的替代方案:

如果你有能力为不存在的字符串回答“存在”的概率

编辑:如果您能承受误报,请使用 Bloom filter正如 WizardOfOdds 在评论中所建议的那样。

对于 k=1,布隆过滤器就像一个没有键的哈希表:每个“桶”只是一个 boolean 值,用于判断是否存在至少一个具有相同哈希的输入。如果 1% 的误报是可以接受的,那么您的哈希表可以小到大约 100 * 2000 万位或大约 200 MiB。每 1000 个误报中就有 1 个是 2GiB。

使用多个哈希函数代替一个可以提高相同位数的误报率。

关于java - 需要内存有效的方式来存储大量字符串(是 : HAT-Trie implementation in java),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2218905/

相关文章:

java - 内部对象更改时 HashSet 的哈希解决方法

javascript - 用于对数据进行排序的多个 (2) 哈希 URL 参数

java - 用于授予图片访问权限的 S3 存储桶签名 URL

c++ - 在不使用额外的整数指针参数的情况下,用节点左侧所有值的总和替换树的每个节点

java - Tomcat 6.0.36 没有报告为什么它以 400 响应

scala - 如何递归解析这种树状结构?

data-structures - 水平顺序遍历的实际使用

random - 如何为实体创建唯一的 7 位代码?

java - 对象和引用创建

java - 使用gradle,错误: cannot find symbol @Test