我们有一个搜索结果映射列表,例如一个简单的URL映射可能看起来像
“stackoverflow” - > “www.stackoverflow.com” “joel” - > “www.joelonsoftware.com”
所以搜索确切的短语工作正常。
现在我们正在寻找增量搜索/预先输入,例如“stackover”也将返回“www.stackoverflow.com”。我们当然可以相应地填充我们的地图,例如将所有可能的字符串放入地图中,从给定最小尺寸的所有变体开始
- >地图键:
堆栈 - >堆栈溢出 ... stackoverf - >堆栈溢出 stackoverfl - >堆栈溢出 stackoverflo - >堆栈溢出 stackoverflow - >计算器
然而,这意味着需要更高的内存占用(我猜)。
有什么建议吗?
答案 0 :(得分:9)
最简单的解决方案:在列表中搜索</ strong>
您也可以动态搜索,例如:
List<String> urls = Arrays.asList("this", "is", "a", "test");
// search for "is"
List<String> reduced = new ArrayList<String>();
String searchWord = "is";
for (String s : urls) {
if (s.contains(searchWord)) {
reduced.add(s);
}
}
// when the user types more, search again using the already reduced list.
第一个serach将是最慢的,但是你可以使用已经减少的列表,这应该快得多。
更复杂:使用Trie
如果性能是一个问题,并且您只允许匹配strign开头的搜索(例如“stackoverflow”的“stack”,而不是搜索术语的“overflow”),那么您应该考虑将数据表示为Trie。这为您提供了O(c)搜索性能,其中c是字符数。因此,搜索性能与搜索项的数量无关,这非常棒。
高级解决方案:使用Suffix Tree
Suffix tree或多或少是一个高级的Trie,在这里你也可以搜索O(c)中的任何子串,就像Trie一样。我会说这是最先进的选择。
答案 1 :(得分:0)
这是一个示例java实现:
http://www.koders.com/java/fid0F06E53F2CFCC6E591C38752F355A7178F92FFE5.aspx
答案 2 :(得分:-1)
这可能有点矫枉过正,但我会查看Lucene这个问题。