字典树Trie算法

        Trie树又称单词查找树,Trie树,是一种树形结构,是一种哈希树的变种。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点是:利用字符串的公共前缀来节约存储空间,最大限度地减少无谓的字符串比较,查询效率比哈希表高。

   

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

    下面给出添加和查找的代码如下:    

# include<stdio.h>
# include<stdlib.h>
# include<string.h>
# include<malloc.h>
# define MAX 26  //我们只算了字母,所以保存每个节点最多有26个子节点

typedef struct trie{
    struct trie *pNext[MAX];
    int v;     //保存这个顶点被访问的次数
}Trie;

void CreateTrie(Trie *root,char *str);
int findTrie(Trie *root,char *str);

int main(void){
    int i;
    Trie root;
    chars1[100] = "abcdef";
    chars2[100] = "ab";
    //初始的时候让根节点的所有下一个节点都为NULL
    for(i=0;i<MAX;i++){
        root.pNext[i] = NULL;
    }

    CreateTrie(&root,s1);
    findTrie(&root,s2);
   
    return0;
}

 
//将字符串加入到字典树中去
void CreateTrie(Trie *root,char *str){
    int i,j;
    Trie *p = root,*q;
    int len = strlen(str);

    for(i=0;i<len;i++){
        int curStrNum = str[i] - 'a'; //把对应的字母转化为数字下标
        if(p->pNext[curStrNum] ==NULL){  //判断该节点的下一个节点中是否已经存在此字母
            q = (Trie *)malloc(sizeof(Trie));
            q->v = 1;  //初始化为1
            for(j=0;j<MAX;j++){
                q->pNext[j] = NULL; //把该字母的所有下一个节点都为NULL
            }
            p->pNext[curStrNum] = q;  //链表指向
            p = p->pNext[curStrNum];   //p回制
        }else{
            p->pNext[curStrNum]->v++;  //如果已经存在了就让节点++
            p = p->pNext[curStrNum];
        }
    }
}

//判断给定的字符串在字典树中是否已有此串的前缀字符
int findTrie(Trie *root,char*str){
    int i;
    Trie *p = root;
    int len = strlen(str);
    for(i=0;i<len;i++){
        int curStrNum = str[i] - 'a';
        if(p->pNext[curStrNum]== NULL){  //说明没有以此字符为前缀的字符
            return 0;
            break;
        }else{
            p= p->pNext[curStrNum];      //有的话就跑到下一个节点去继续查找      
        }
    }
    return 1; //遍历完成以后如果没有找到不匹配的节点,就返回真

}
    原文作者:Trie树
    原文地址: https://blog.csdn.net/z1547840014/article/details/10528879
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞

发表评论

电子邮件地址不会被公开。 必填项已用*标注