搜索三位数据结构

时间:2014-11-25 08:21:44

标签: c# data-structures

我有大约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

1 个答案:

答案 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();    
    }
}

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