2014-11-25 183 views
0

我有大约150,000个字加载到一个Trie数据结构,并希望搜索。每次我在searchBox中输入一个新字符时,都会作为NextMatch的参数传递。搜索三数据结构

例如:如果我输入'Appl',则将返回以'Appl'开头的所有单词。如果我输入字符'e',则同样显示以'Apple'开头的所有单词。

问题是,当我删除字符'e'时,'l'将作为NextMatch参数传递给Matcher方法,并创建类似'Appll'的东西,但我想要以'Appl'开头的那些单词的列表。

这里是我的代码狙击

private void searchBox_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    listboxWords1.Items.Clear(); 

    if (searchBox.Text.Length > 0) 
    { 
     trie.Matcher.NextMatch(searchBox.Text.Trim().Last()); 
     foundWords = trie.Matcher.GetPrefixMatches(); //foundWords is List<string> 
     for (int i = foundWords.Count - 1; i > 0 ; i--) 
     { 
      listboxWords1.Items.Add(foundWords[i]); 
     } 

     foundWords = null; 
     isFoundExact = trie.Matcher.IsExactMatch(); 
     if (isFoundExact) 
      listboxWords1.Items.Add(trie.Matcher.GetExactMatch()); 
    } 
    else 
    { 
     foundWords = null; 
     trie.Matcher.ResetMatch(); 

    } 
} 

特里数据结构的实现,可以发现here

+0

主要问题是我无法确定是否输入了新字符或者字符是否已从最后一个字符串中删除。如果我可以确定一个字符被删除,我可以告诉它搜索剩余的字符一个接一个。 – Hadi 2014-11-25 08:29:00

回答

0

看来API是单向的,但是这很好,我们可以重新每次从一开始就计算匹配。

Trie的计算复杂度并不是那么大,所以你不会感觉到任何性能问题。

private void searchBox_TextChanged(object sender, TextChangedEventArgs e) 
{ 
    listboxWords1.Items.Clear(); 

    if (searchBox.Text.Length > 0) 
    { 
     trie.Matcher.ResetMatch();//Reset the match 

     foreach (char c in searchBox.Text) 
      trie.Matcher.NextMatch(c); //Start the match from beginning 

     foundWords = trie.Matcher.GetPrefixMatches(); //foundWords is List<string> 
     for (int i = foundWords.Count - 1; i > 0 ; i--) 
     { 
      listboxWords1.Items.Add(foundWords[i]); 
     } 

     foundWords = null; 
     isFoundExact = trie.Matcher.IsExactMatch(); 
     if (isFoundExact) 
      listboxWords1.Items.Add(trie.Matcher.GetExactMatch()); 
    } 
    else 
    { 
     foundWords = null; 
     trie.Matcher.ResetMatch();  
    } 
} 

未经测试,但应该给你一个想法。如果用户键入的速度非常快,并且想要避免频繁计算,则可以使用一些限制逻辑推迟搜索算法。

+0

它的工作太棒了。你有什么想法的人!谢谢! – Hadi 2014-11-25 09:11:18

+0

我推动了你一个编程问题 – Hadi 2014-11-27 14:03:05

+0

@哈迪我建议你在这里发布一个问题与相关的代码。我会尽力帮助,而这个问题也可能帮助其他人。 Btw很多人在这里等着帮助别人,所以你很快就会得到很好的答案。如果你想让我看看它,请发表问题并分享链接。谢谢。我也在twitter中回复了:) – 2014-11-27 14:10:08