java中的Typeahead / Incremental Search

时间:2008-12-31 11:30:39

标签: java search data-structures

我们有一个搜索结果映射列表,例如一个简单的URL映射可能看起来像

“stackoverflow” - > “www.stackoverflow.com” “joel” - > “www.joelonsoftware.com”

所以搜索确切的短语工作正常。

现在我们正在寻找增量搜索/预先输入,例如“stackover”也将返回“www.stackoverflow.com”。我们当然可以相应地填充我们的地图,例如将所有可能的字符串放入地图中,从给定最小尺寸的所有变体开始

- >地图键:

堆栈 - >堆栈溢出 ... stackoverf - >堆栈溢出 stackoverfl - >堆栈溢出 stackoverflo - >堆栈溢出 stackoverflow - >计算器

然而,这意味着需要更高的内存占用(我猜)。

有什么建议吗?

3 个答案:

答案 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这个问题。