我有一个大字符串集,我想为它创建一个autosuggest功能。
假设该集合为["foo", "fighter"]
键入"f"
应返回两个值,输入"fo"
只应返回"foo"
。
目前,我只是通过调用startsWith
来迭代设置和归档结果,但它太慢了。
标准TreeSet
及其子集函数在这里没有多大帮助,因为它只实现了一个RB树。
Java API中是否有高效的解决方案,还是我必须构建自己的Set
实现?
编辑:
我的实现看起来像这样,使用Andrey Naumenkos trie datastructures。如果要使用扩展ASCII字符,请注意增加数组大小。如果您使用List
代替Map
,则会按排序顺序获得结果。
public Set<String> getSubset(String s) {
result = new HashSet<String>();
getSubset(root, s);
return result;
}
private void getSubset(TrieNode node, String s) {
TrieNode n = node;
for (char ch : s.toCharArray()) {
if (n.children[ch] != null) {
n = n.children[ch];
continue;
}
return;
}
getSubsetR(n, s);
}
private void getSubsetR(TrieNode node, String s) {
for (char ch = 0; ch < node.children.length; ch++) {
TrieNode child = node.children[ch];
if (child != null)
getSubsetR(child, s + ch);
}
if (node.leaf) {
result.add(s);
}
}
答案 0 :(得分:11)
您要寻找的是前缀树数据结构:http://en.wikipedia.org/wiki/Trie
此处的代码可以帮助您入门:https://sites.google.com/site/indy256/algo/trie