【问题标题】:Typeahead / Incremental Search in javajava中的Typeahead /增量搜索
【发布时间】:2010-09-29 00:03:31
【问题描述】:

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

“stackoverflow”->“www.stackoverflow.com” “乔尔”->“www.joelonsoftware.com”

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

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

-> 映射键:

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

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

有什么建议吗?

【问题讨论】:

  • 我添加了数据结构标签

标签: java search data-structures


【解决方案1】:

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

您也可以即时搜索,例如:

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

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

高级解决方案:使用Suffix Tree

Suffix tree 或多或少是一个高级的 Trie,在这里你也可以搜索 O(c) 中的任何子字符串,就像 Trie 一样。我会说这是最高级的选项。

【讨论】:

  • 后缀树与trie非常相似,渐近搜索性能相同(尤其是not常量)。
  • 当你限制最大字符数时它的 O(1),所以我想你可以说它是恒定的。至少它与元素的数量无关。
【解决方案2】:

谢谢,Trie 是个好建议。我首先认为这是一个错字,你的意思是树:)

这是一个示例 java 实现:

http://www.koders.com/java/fid0F06E53F2CFCC6E591C38752F355A7178F92FFE5.aspx

【讨论】:

    【解决方案3】:

    这可能有点矫枉过正,但我​​会检查 Lucene 来解决这个问题。

    【讨论】:

    • Lucene 与此问题无关
    猜你喜欢
    • 2015-02-05
    • 2014-10-27
    • 2023-03-09
    • 2015-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-11-18
    相关资源
    最近更新 更多