字典树(trie)

字典树(trie)是一种词典的储存结构,它的基本特征:
1.除根节点外每个节点都能包含字符。
2.从根结点到某一节点,经过路径的所有的字符串起来就是这个节点对应的字符串。
3.每个节点的子节点的字符都不一样。
字典树的核心思想:用时间换取空间。因为"根结点"的字符就是子树的公共前缀,方便了检索,所以常用于统计和排序大量的字符串(当然不仅仅是字符串)。它的时间复杂度:O(n),空间的复杂度:26^n数量级。[n是字符串的长度]
结点结构:
struct node{
   int num; //到达这里的字符串的个数
   bool final; //当final==true表示当前结点是该字符串的最后一个字符。
   struct node *next[26];  //假设存储26个小写英文字符。
};
初始化:
node root;
void init(node &p){
   p=new node();
   for(int i=0;i<26;i++)p->next[i]=0;
   p->final=0;
   p->num=0;
}
插入操作:
void insert(char s[]){
   int i=0;
   node *p=root;
   while(s[i]){
       if(!p->next[s[i]-97]]){
           node *q;
           init(q);
           p->next[s[i]-97]=q;
    }
       p=p->next[s[i]-97];
       p->num++;
       i++;
   }
   p->final=1;
}
查找:
int find(node p,char s[]){
   int k=0;
   while(s[k]&&p->next[s[k]-97]){
       p=p->next[s[i]-97];
       k++;
   }
   if(s[k]==0)return p->num;
   return 0;
}

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