C++———trie树字典树个人解析


自我介绍:hello!这里是欧_aita的频道,一个初学数据结构与算法的小白。
小欧的今日语录: 青春由磨砺而出彩,人生因奋斗而升华!
小欧的祝福语:让我们在未来的道路上共同进步!
大家可以在评论区畅所欲言,可以指出我的错误,在交流中共同进步。
如果你也恰好在学习C++或者数据结构与算法那就来看看主页吧—— 欧_aita。

一.trie树字典树初理解🚀

1.1 trie树字典树是用于做什么的

字典树(TrieTree),是一种树形结构,典型应用是用于统计,排序和保存大量的字符串(但不仅限于字符串,如01字典树)。主要思想是利用字符串的公共前缀来节约存储空间。很好地利用了串的公共前缀,节约了存储空间。字典树主要包含两种操作,插入和查找。

1.2 trie树字典树理论

根节点是空节点,在实现字典树的过程中就像一个树。
图1

实现查找好比说我要实现查找出abdon,会从根节点开始查找第一个字母a,找到后再接着查找第二个单词b。重复这个过程,直到查找到n,并且发现n字母被标记,即查找结束。但是如果找到了一个完整的字符串却发现最后一个字母没有标记呢?就如同查找字符串ab,发现b并没有被标记,结果就是不算查找到。
————————————————————————————————
实现插入这是用到数组实现的,每个父节点最多都会有26个子节点,这分别对应了26个字母,在插入的过程之中会用到一个idx表示插入了多少个节点。a是第一个插入的节点,即idx对应1。比如根节点的子节点a为son[0][1]=1,然后通过索引1可以插入a的子节点son[1][2]=b的插入排序数字。

1.3 trie树字典树代码实现

1.3.1 声明

定义的这些可以先不看,然后在后续的代码片段里理解这些变量的作用。

#include <iostream>
using namespace std;
const int N=100010;
int p,cnt[N],son[N][25];
char str[N];

1.3.2 insert插入

u的作用是存储的字母的ASCII码值,判断在son[][]二维数组中存储在哪,也就是说会存储在son[][u]的位置,并且位置表示字母,数组里面存储的是索引,是用来查找下一个字母的。


在插入的过程中肯定是一个从无到有的过程,使用if条件语句,如果没有就创造,如果有就顺势向下。


cnt[]数组表示存储了多少个字符串,数组中有多少个值不为零就有多少个字符串已存储。

void insert(char str[])
{
    int p=0;
    for(int i=0;str[i];i++)
    {
        int u=str[i]-'a';
        if(!son[p][u]) son[p][u]=++idx;
        p=p[p][u];
     }
     cnt[p]++;
}

1.3.3 query查找

这个数组主要是用于判断一个字符串是否在字典树中,原理与插入区别并不大。

int query(char str[])
{
    int p=0;
    for(int i=0;str[i];i++)
    {
        int u=str[i]-'a';
        if(!son[p][u])return 0;
        p=son[p][u];
     }
     return cnt[p];
}

二.trie树字典树思想力扣实战🚀

2.1最长公共前缀

图2
这道题可以使用字典树思想。

string longcommonprofix(vector<String>& strs[])
{
    string& str[]=strs[0];
    int len=str.size();
    for(int i=0;i<strs.size();i++)
    {
       len = min(len,(int)strs[i].size());
       for(int k=0;strs[i][k];k++)
           if(str[k]!=strs[i][k])
           {
               len=k;
               break;
           }
      }
      return str.substr(0,len);
}
           

substr(x,y)表示的意思是从字符串中输出从x到y的一串字符串。其中x下0和1表示的都是从最左边一个输出至第 y个字符,包含空格在内。
若x=-1,表示的意思是从右向左的第一个字符开始。


这道题算是把字典树的思想应用了一遍,并不是难题,不过有收获了许多。

这篇文章就到此为止,如果觉得读完后对你有所帮助的话就点个赞吧,你们的支持是我最大的动力!

  • 8
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 11
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 11
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Aitee

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值