我有大约150,000个单词加载到Trie数据结构中并想要搜索它。每次我在searchBox中输入一个新字符时,它将作为NextMatch的参数传递。
例如:如果我输入'Appl',那么将返回以'Appl'开头的所有单词。如果那时我输入字符'e',则同样会显示以'Apple'开头的所有单词。
问题在于,当我删除字符'e'时,'l'将作为NextMatch的参数传递给Matcher方法,并找到类似'Appll'的内容,但我想要以'Appl'开头的那些单词列表。< / p>
这是我的代码sniped
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();
}
}
可以找到Trie数据结构的实现here
答案 0 :(得分: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();
}
}
未经测试,但这应该会给你一个想法。如果用户键入速度非常快并且您希望频繁地避免计算,则可以使用一些限制逻辑来推迟搜索算法。