我有一个40MB(在这种情况下对于内存来说太大)字符串列表,我想要“开头”查询以提取匹配项。有人知道这个好的数据结构吗?现有os java实现的加分点。如果已经存在某些东西,我愿意牺牲“开始于”以完全匹配。基于磁盘的trie听起来很理想。
答案 0 :(得分:2)
看起来你需要这样的东西:http://en.wikipedia.org/wiki/Trie
可以找到Java中的实现here,尽管它不是基于磁盘的。我会继续搜索:/
实用论文:Trie methods for text and spatial data on secondary storage,B-tries for disk-based string management
编辑:我发现这可能有用:MG4J: Managing Gigabytes for Java™
答案 1 :(得分:1)
不能建议任何现有的库,但我之前处理过类似的问题。如果您不打算动态修改列表并且可以对文件中的字符串进行排序(用于二进制搜索),这很容易。
让我们将你的40Mb分成1000个大小相等的块,并保留内存中每个块的第一个字符串。这将是一个1000字符串的数组。他们订购了,因为订购了原始清单 当您需要执行查询时,可以在该数组上使用二进制搜索。这将显示哪个块结果字符串所在。然后你可以从磁盘读取该块(约40kb)并搜索其内容。
例如,如果数组包含值["andrew", "brian", "donald", "john"]
并且您搜索前缀"cris"
,则您知道所有Cristophers和Cristians都在第二个块中。