Trie最长的前缀匹配

时间:2014-11-14 14:33:24

标签: java trie

我没有在trie中得到概念这个词的结尾。我认为我对特里本身的理解是不完整的。有人可以在代码HERE

中解释以下内容
// If this is end of a word, then update prevMatch
               if( crawl.isEnd() ) 
                    prevMatch = level + 1;

2 个答案:

答案 0 :(得分:1)

IsEnd killswitch在单词结束时设置,但它不是trie或搜索的结尾。单词被词典存储到树或散列图中。可能会发生搜索词不是第一个或第二个杀戮开关。

答案 1 :(得分:0)

当代码爬上trie搜索gifen单词的最长前缀时会发生这种情况。

假设你有一个已包含单词的特里:

“的” “一” “一次”

并且您正在尝试搜索“繁重”的最长前缀,您希望它在3处出现(即“1”是已经存在的最长前缀。

正在执行的代码为:

    // See if there is a Trie edge for the current character
    if (child.containsKey(ch)) {
        result += ch;          //Update result
        crawl = child.get(ch); //Update crawl to move down in Trie

        // If this is end of a word, then update prevMatch
        if (crawl.isEnd()) {
            prevMatch = level + 1;
        }
    } else {
        break;
    }

所以想象一下,你正在看着“繁重”的“n”。您发现“on”作为片段在trie中,但不是end(因为您没有在trie中单词“on”但是单词“one” 在那里)。此代码将继续使用下一个字符“e”爬树,但不会更改prevMatch。然而,当它看到“e”时,树中的匹配它是end,因为单词“one”在树中,所以此代码存储{{1在3