我需要在内存中缓存大量数据并能够非常有效地搜索它。它本质上是一个字符串列表,对于给定的输入,我想返回包含该输入的字符串列表。
例如,如果列表包含以下字符串:
abc def
def ghi
ghi jkl
输入是:
ef
我想返回前两个字符串作为输出(最好按字母顺序)。
我正在考虑使用 Java Set实现,将所有字符串放入其中,并放入内存中。对于任何给定的输入,我将循环遍历 Set
并使用 String.contains()
查找包含输入的记录,并将结果添加到另一个 Set
或 列表
。
这是实现这一目标的最有效方法吗?性能非常重要,而且数据量非常大(数十兆字节)。如有必要,我可以为此目的拥有一个具有大量内存的专用服务器实例。
最佳答案
Set
或 HashSet
尤其不会提供出色的性能,因为您必须迭代整个 set
并执行 contains
检查输入是否是子字符串。您肯定需要一个字符串数据结构。
- 看看Suffix trees和 Generalized suffix tree特别是,它给你 O(m) 时间来检查长度为 m 的 S 是否是子字符串或存在于树中。
- 您可以构建一个 inverted index
最后,您可以使用 Lucene这是 Java 的文本倒排索引,也可以在堆外工作
关于Java 通过搜索在内存中设置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33324406/