码迷,mamicode.com
首页 > 其他好文 > 详细

trie树(字典树)

时间:2017-10-07 22:49:04      阅读:170      评论:0      收藏:0      [点我收藏+]

标签:提高效率   创建   new   核心   公共前缀   style   logs   基本   class   

核心思想:

利用字符串的公共前缀来降低查询时间的开销以达到提高效率的目的

举个例子

技术分享

上图是由

  • am
  • as
  • tea
  • too
  • tooth
  • two

构成的字典树。每个节点代表的单词是从根遍历到他的路径,标黄的是当前节点存在单词

代码实现:

struct Trie{
    Trie *son[26];
    bool w;//记录当前节点是否是单词; 
}root;

基本性质:

  1. 根节点不包含字符,除根节点外每一个节点都只包含一个字符。
  2. 从根节点到某一节点,路径上经过的字符连接起来,为该节点对应的字符串。
  3. 每个节点的所有子节点包含的字符都不相同。

查询和插入

对于一个单词,我只要按照它的每个字母从根走到对应的节点,再看这个节点是否被标记为黄色就可以知道它是否出现过了。
如果没被标记,把这个节点标记为红色,就相当于插入了这个单词,这样查找和插入就可以一起实现。

代码实现:

void search(char s[]){//查找和插入 
    Trie *x=&root;
    for(int i=0;s[i];i++){
        if(x->son[s[i]-a]==NULL){//判断之前是否出现过 
            x->son[s[i]-a]=new Trie;//创建新的节点 
        }
        x=x->son[s[i]-a];
    }
    if(!x->w)sum++,x->w=1;//sum总结点数+1 
}

因为空间是动态分配的,所以用完要释放

void trie_free(Trie* x){//空间释放 
    for(int i=0;i<26;i++){
        if(x->son[i]!=NULL)trie_free(x->son[i]);//先释放子节点 
    }
    delete x;
}

 

trie树(字典树)

标签:提高效率   创建   new   核心   公共前缀   style   logs   基本   class   

原文地址:http://www.cnblogs.com/bennettz/p/7636021.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!