Trie 字典树

本文深入探讨了字典树(Trie树)的基本概念、核心应用及其实现方法,详细介绍了如何使用字典树进行字符串的高效统计与查找,包括插入和查找操作的代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

字典树,又称 Trie 树,是一种树形结构。典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串)。主要思想是利用字符串的公共前缀来节约存储空间。 


 
上图便是一棵字典树,“从根节点到任意一个红色节点的路径上的字母组成一个单词”。 字典树主要包含两种操作,插入和查找。也有一说亦含有删除操作,但这基本属于查找操作的变种,初步学习需要重点掌握插入和查找操作。 

字典树可以高效的用来统计某个字符串出现的次数,字典树可以说是必须要掌握的,不然无法学习Aho-Corasick自动机。

#include<cstdio>
#include<cstdlib>
using namespace std;
char s[11];   //此代码中字典树中的单词长度不超过 10
struct Trie{
    Trie* next[26];          //结构体指针
    int sum;                //从根结点到当前结点之间单词出现的次数
    Trie(){                    //构造函数 便于初始化
        for(int i=0;i<26;i++){             //初始化
            next[i]=NULL;
        }
        sum=0;
    }
}root;
void insert(char* s)   //创建字典树 在字典树上插入结点
{
    Trie* p=&root;
    for(int i=0;s[i];i++){
        if(p->next[s[i]-'a']==NULL){
            p->next[s[i]-'a']=new Trie;
        }
        p=p->next[s[i]-'a'];
        p->sum++;
    }
}
int find(char* s)        //查找单词
{
    Trie* p=&root;
    for(int i=0;s[i];i++){
        if(p->next[s[i]-'a']==NULL)return 0;
        else p=p->next[s[i]-'a'];
    }
    return p->sum;
}
int main(){
    while(gets(s)&&s[0]!='\0')             //读取字典中的单词 将其插入字典树中
        insert(s);
    while(scanf("%s",s)==1){           //在字典树中查找单词出现的次数
        printf("%d\n",find(s));
    }
    return 0;
}


 
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值