java中的提前键入/增量搜索

java中的提前键入/增量搜索,java,search,data-structures,Java,Search,Data Structures,我们有一个搜索结果映射列表,例如,一个简单的url映射可能看起来像 “stackoverflow”->“www.stackoverflow.com” “joel”->“www.joelonsoftware.com” 因此,搜索准确的短语是可行的 现在,我们正在寻找一个增量搜索/typeahead,例如,“stackover”也会返回“www.stackoverflow.com”。当然,我们可以相应地填充地图,例如,将每个可能的字符串放入地图,从给定最小大小的所有变量开始 ->地图键: 堆栈->堆

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

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

因此,搜索准确的短语是可行的

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

->地图键:

堆栈->堆栈溢出 ... 堆栈溢出->堆栈溢出 堆栈溢出->堆栈溢出 stackoverflo->stackoverflow stackoverflow->stackoverflow

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


有什么建议吗?

最简单的解决方案:在列表中搜索

您还可以动态搜索,例如:

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.
List url=Arrays.asList(“this”、“is”、“a”、“test”);
//搜索“是”
列表减少=新的ArrayList();
字符串searchWord=“is”;
用于(字符串s:URL){
如果包含(搜索词)){
减少。增加;
}
}
//当用户键入更多内容时,请使用已减少的列表再次搜索。
第一个serach将是最慢的,但是你可以使用已经减少的列表,它应该快得多

更复杂:使用

如果性能是一个问题,并且您只允许搜索与strign开头匹配的数据(例如,“stack”表示“stackoverflow”,而不是“overflow”作为搜索词),那么您应该考虑将数据表示为字符串。这将提供O(c)搜索性能,其中c是字符数。因此,搜索性能与搜索词的数量无关,这非常棒

高级解决方案:使用


A或多或少是一个高级Trie,在这里您还可以搜索O(c)中的任何子字符串,就像搜索Trie一样。我认为这是最先进的选择。

谢谢,Trie是一个很好的建议。我起初以为是打字错误,你指的是树:)

下面是一个示例java实现:


这可能有点过分了,但我想看看Lucene的这个问题。

后缀树非常类似于一种trie,渐近搜索性能是相同的(特别是,它不是常数)。当你限制最大字符数时,它是O(1),所以我想你可以说它是常数。至少它与元素的数量无关。我添加的数据结构tagLucene与这个问题无关