在Trie操作上无法弄清楚这个算法(递归)

时间:2012-05-25 05:04:47

标签: algorithm data-structures dictionary computer-science trie

有人可以帮我理解下面的pheudocode吗?

countWords(vertex, word, missingLetters)  
    k=firstCharacter(word)  
    if isEmpty(word)  
        return vertex.words  
    else if notExists(edges[k]) and missingLetters=0  
        return 0  
    else if notExists(edges[k])  
        cutLeftmostCharacter(word)  
        return countWords(vertex, word, missingLetters-1)  
        //Here we cut a character but we don't go lower in the tree  
    else  
        //We are adding the two possibilities: the first  
        //character has been deleted plus the first character is present  
        r=countWords(vertex, word, missingLetters-1)  
        cutLeftmostCharacter(word)  
        r=r+countWords(edges[k], word, missingLetters)  
        return r    

我们的想法是使用Trie我们试图查找单词出现在字典中的次数,但我们可能会丢失字母。
我迷失在else部分。我不明白这个逻辑 例如,如果我们单词的第一个字符是匹配,我们会点击最后一个else,然后在同一级别的countWords上递归,但使用missingLetters-1,但这不是一个相同的循环?即它会再次比较同一级别的第一个字母,依此类推? 有人可以帮我解决这个问题吗?

2 个答案:

答案 0 :(得分:0)

该算法有缺陷。我怀疑由于某种原因,最后一次调用cutLeftMostCharacter已经与前一行交换了。如果代码会读取

   cutLeftmostCharacter(word)  
   r=countWords(vertex, word, missingLetters-1)  
   r=r+countWords(edges[k], word, missingLetters)  

这会更有意义。

答案 1 :(得分:0)

即使最后一行的顺序按照antti.huima的建议反转,对我来说仍然看起来不太好。

如果我理解正确,如果您有PizzaLizza也应该计算,如果missingLetters == 1,对吧?但是,如果Lizza不在特里,你输入

else if notExists(edges['l'])  
        cutLeftmostCharacter(word) # 'izza' left  
        return countWords(vertex, 'izza', 0) #vertex is 'P' I guess

然后输入

else if notExists(edges['i']) and missingLetters=0

返回0?

鉴于你已经有了特里,我建议你看看Levehnstein Distance