首页 > 其他分享 >【字典树/trie树】实现高效插入和查询字符串的数据结构

【字典树/trie树】实现高效插入和查询字符串的数据结构

时间:2024-01-10 14:11:56浏览次数:35  
标签:结点 idx trie son int str 数据结构 id 字典

  本文是https://www.acwing.com/problem/content/description/837/的总结,有兴趣可以做做

  字典树的实现依赖于树结构,有两种操作,1是插入字符串,2是查找字符串。使用idx维护最新的结点下标。如下图,假设我们维护一个

   可以看到,我们维护了一个树形结构储存了左边的字符串,但是我们不止建立这样的树,还得标记每个字符串的结尾

   这样,当我们多次插入像ab这样的字符串的时候就可以记录下插入的总数。我们将每个结点都标记一个编号,根结点标记为0,起全局变量idx实现。具体代码实现如下:

 1 #include<bits/stdc++.h>
 2 #define int long long
 3 using namespace std;
 4 const int INF = 1e18 + 10,maxn = 1e5 + 10;
 5 
 6 int n;
 7 int son[maxn][26],idx,cnt[maxn];
 8 
 9 void insert(char str[]){
10     int p = 0;
11     for(int i = 0; str[i] ; i++){
12         int id = str[i] - 'a';
13         if(!son[p][id]) son[p][id] = ++idx;
14         p = son[p][id];
15     }
16     cnt[p]++;
17 }
18 
19 int quary(char str[]){
20     int p = 0;
21     for(int i = 0; str[i]; i++){
22         int id = str[i] - 'a';
23         if(!son[p][id]) return 0;
24         p = son[p][id];
25     }
26     return cnt[p];
27 }
28 signed main (){
29     ios::sync_with_stdio(false);
30     cin.tie(0),cout.tie(0);
31     
32     cin>>n;
33     char str[maxn];
34     for(int i = 1; i <= n; i++){
35         char op;
36         cin>>op;
37         cin>>str;
38         if(op == 'I'){
39             insert(str);
40         }else if(op == 'Q'){
41             cout << quary(str) << '\n';
42         }
43     }
44     
45     return 0;
46 }

  在这里解释以下数据结构作用

  son[i][id]//表示结点i的儿子id是否存在。(还记得吗,我们使用idx给每个结点编号)   idx//当更新结点时++idx,赋予新建立的结点独一无二的编号。
  cnt[i]//表示以结点i结尾的字符串的数量,相当于上图中给每个字符串结尾标记。

标签:结点,idx,trie,son,int,str,数据结构,id,字典
From: https://www.cnblogs.com/jiangjlon/p/17956359

相关文章

  • 【Python基础】dict(字典)
    简介介绍dictionary(字典)是除列表以外Python之中最灵活的数据类型字典同样可以用来存储多个数据通常用于存储描述一个物体的相关信息和列表的区别列表是有序的对象集合字典是无序的对象集合字典用{}定义字典特性*字典使用键值对存储数据,键值......
  • 【数据结构】栈的基本知识详解
    栈的基本概念与基本操作导言大家好,很高兴又和大家见面了!!!今天开始,咱们将正式进入【数据结构】第三章的内容介绍。在第三章的内容中,我们需要掌握栈和队列的操作及其特征,以及数组与特殊矩阵的压缩存储等知识点。为了更好的掌握这些知识点,我们将对这些知识点进行一一介绍。今天要介绍......
  • 数据结构线性表之【循环链表、双向链表】
    循环链表在单链表中,每个结点都带有一个指向其后继结点的指针,但因为表尾元素没有后继结点,所以表尾结点的指针域为空,表明它不指向任何结点,并表示这个结点是最后一个结点。现在修改这个约定,将表尾结点的指针指回头结点,从而形成一类新链表。在这样的链表中,从任何一个结点出发并沿着指针......
  • 数据结构【树篇】(二)
    数据结构【树篇】(二)文章目录数据结构【树篇】(二)前言为什么突然想学算法了?为什么选择码蹄集作为刷题软件?目录树(一)、树的存储(二)、树和森林的遍历——并查集(三)、并查集的优化结语前言为什么突然想学算法了?>用较为“官方”的语言讲,是因为算法对计算机科学的所有分支都非常重......
  • Trie字符串统计题解
    维护一个字符串集合,支持两种操作:"Ix"向集合中插入一个字符串x;"Q×"询问一个字符串在集合中出现了多少次。共有N个操作,输入的字符串总长度不超过105,字符串仅包含小写英文字母。输入格式第一行包含整数N,表示操作数。接下来N行,每行包含一个操作指令,指令为"l×"或"Q×"中的一种。......
  • 算法与数据结构(开篇)
    基本概念:算法(Algorithm):⼀个计算过程,解决问题的⽅法NiklausWirth:“程序=数据结构+算法”时间复杂度时间复杂度:⽤来评估算法运⾏效率的⼀个式⼦经验当算法过程出现循环折半的时候,复杂度式⼦中会出现logn.时间复杂度是⽤来估计算法运⾏时间的⼀个式⼦(单位)常⻅的时间复杂度(按效率排......
  • 严蔚敏《数据结构》存储结构
    目录1.单链表2.双向链表3.带头结点的链表4.顺序栈5.单链队列6.循环队列7.广义表头尾链表存储8.广义表的扩展线性链表存储9.二叉树二叉链表存储表示10.树的双亲表示法11.树的孩子链表存储表示(孩子表示法)12.树的孩子兄弟表示法(二叉树表示法)13.二叉树的二叉线索存储......
  • 数据结构——顺序线性表(向量)
    参考文章:数据结构(顺序表——线性表)_创建顺序线性表sl,调用initlist()函数对sl初始化-CSDN博客以下是作为个人笔记,自己学习用。线性表是具有相同特性的数据元素的一个有限序列,在线性表中每个数据元素由逻辑序号唯一确定。线性表的特性:1.有穷性:表中元素个数是有限的。2.一致性:表中所......
  • 数据结构【线性表之单链表】
    链表链表:线性表还可以使用链式存储方式保存,即线性表中的各个元素保存在各自的存储空间中,形成一个个节点。这些结点在内存的地址不要求是相邻的,它们之间通过指针连接起来。特点:灵活存储,不要求预先分配一块连续的空间,而是按需分配,随时需要,随时分配不要求分配的空间必须是相邻的没有......
  • 数据结构线性表之顺序表
    定义:一个线性表是由同类型数据元素构成的有限序列一般地,当表示一个由n(n>=0)个元素组成的线性表L时,将线性表中的所有元素列在一对括号中,每个元素之间以逗号分隔,如L=(a0,a1,....,an-1)不搞的像数据那么麻烦了,按我理解的来表项:线性表中的数据元素表头元素:线性表的第一个元素表尾元素:......