字典树

Posted santiego

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了字典树相关的知识,希望对你有一定的参考价值。

字典树入门

原理

将一个长度为(n)的单词,维护在一个(n)层的树中,每层存对应的字母;判断时,一层一层地判断,最后一层注意要还要判断这个节点是非曾作为为一个单词的终点(如存有abcd,判断abc)

实现

数据结构

struct nod{
    int nxt[26];
    bool hav;
}t[MAXN];
int tot;

结构体nod为字典树节点,nod.nxt表示该节点的儿子们所在的节点,nod.hav表示该节点是非层作为为一个单词的终点,MAXN表示这个字典树最大层数,tot用于分配新节点编号

加入

void add(string s){
    int len=s.size(),rot=0;
    for(int i=0;i<len;i++){
        if(t[rot].nxt[s[i]-‘a‘]!=0) //有无该节点
            rot=t[rot].nxt[s[i]-‘a‘];   //有该节点,则跳至该节点,重定向
        else{
            t[rot].nxt[s[i]-‘a‘]=++tot; //无节点,分配新节点
            rot=tot;
        }
    }
    t[rot].hav=1;
}

非递归写法,有点抽象,可以结合上文数据结构理解

查询

bool search(string s){
    int len=s.size(),rot=0;
    for(int i=0;i<len;i++){
        if(t[rot].nxt[s[i]-‘a‘]!=0)
            rot=t[rot].nxt[s[i]-‘a‘];
        else
            return false;
    }
    return t[rot].hav;
}

一层一层地找,最后注意判断是非为终点

以上是关于字典树的主要内容,如果未能解决你的问题,请参考以下文章

字典树(java)

字典树(java)

Python代码阅读(第19篇):合并多个字典

统计难题HDU - 1251map打表或字典树字典树模板

Python代码阅读(第26篇):将列表映射成字典

字典树——入门学习(java代码实现)