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

文章目录

  • 一.trie树字典树初理解
    • 1.1 trie树字典树是用于做什么的
    • 1.2 trie树字典树理论
    • 1.3 trie树字典树代码实现
      • 1.3.1 声明
      • 1.3.2 insert插入
      • 1.3.3 query查找
  • 二.trie树字典树思想力扣实战
      • 2.1最长公共前缀

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

一.trie树字典树初理解

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

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

1.2 trie树字典树理论

根节点是空节点,在实现字典树的过程中就像一个树。
C++———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 
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最长公共前缀

C++———trie树字典树个人解析_第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,表示的意思是从右向左的第一个字符开始。


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

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

你可能感兴趣的:(数据结构与算法,c++,开发语言)