现在的位置: 首页 > 综合 > 正文

字典树 (解析加模版)

2013年07月23日 ⁄ 综合 ⁄ 共 867字 ⁄ 字号 评论关闭

          字典树:又叫trie树,单词查找树。是一种树形结构,典型的用于统计。经常用于统计一片文章当中出现确定的单词的次数,它的优点就在于:省略了相同前缀的比较。以下图为例:用单词carbohy,carhure,english,englnee来构造的trie树。 


                                     


         当你用trie树来查找一个单词的时候,就像查字典是一样的,先查第一个单词,然后查第二个,在树中我们用深度遍历就可以实现。当然你不一定存储字母也可以存储数字什么的,根据具体情况来选择。

trie树结构定义:

typedef struct node
{
       int cnt;               //用来经过此结点以上前缀的单词数
       node* next[26];        //这里只包含小写字母,故是26个
} Trie;

next数组视情况而定,如果既有小写又有大写就是52,如果还有数字则更多。

接着就是构造trie树了,根据提供的单词构造trie树

过程如下:(跟树的构造类似)

void Creat_Trie(char*str){
     int len,i,j;
     len=strlen(str);
     Trie *p=&root,*q;
     for( i=0; i<len; i++){
          int id=str[i]-'a';            //在next数组中找到对应位
          if( p->next[id]==NULL){
              q=new Trie;            //如果该字符不存在,动态分配节点
              q->cnt=1;
              for( j=0; j<26; j++)
                   q->next[j]=NULL;
              p->next[id]=q;
              p=p->next[id];
          }
          else{
               p->next[id]->cnt++;
               p=p->next[id];
          }
     }
}

构造trie树之后查找,这也是trie树重要的功能。

 int Find_Trie(char*str){ 
    int len,i,j,id;
    len=strlen(str);
    Trie*p=&root;
    for( i=0; i<len; i++){
         id=str[i]-'a';
         p=p->next[id];
         if( p==NULL)
             return 0;
    }
    return p->cnt;
}












抱歉!评论已关闭.