前缀树Trie

       利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较。经常被搜索引擎系统应用于文本词频统计。从根节点出发,途径的结点直到叶子结点,都可以构成单词。当然,有的可能在途中就可以构成单词,所以我们可以扩展,增加额外的信息,记录当前位置是否能够构成单词。

       为什么说它可以减少无谓字符串的比较,通过下面的代码我们可以看到,对于每个字符,是采取随机存取的方式来判断它是否有子结点的。如果有,我们顺着这条路径下去,每次比较的都是两个单词的前缀。如果相同则继续下去,如果不同则“另辟蹊径”。可以发现我们每次的操作都是“有意义”的。那什么是无意义的呢?举例说明,如果我们有两个单词"ask", "aswl"中寻找"ash",那么需要分别对ask和aswl比较,那么对于‘a’和‘s’都是比较了两次的。而在前缀树中,我们只需要比较一次。所以提高了效率。

class TrieNode{
    TrieNode *child[26];
public:
    int count;
    TrieNode(){
        for(int i = 0; i < 26; i++) child[i] = NULL;
        count = 0;
    }

    TrieNode* get(char ch){
        if(child[ch - 'a'] == NULL){
            child[ch - 'a'] = new TrieNode();
            count++;
        }
        return child[ch - 'a'];
    }
};

//如果count == 0,说明是叶结点

 

你可能感兴趣的:(#,数据结构)