首页 > 其他分享 >Trie树

Trie树

时间:2023-12-12 22:34:23浏览次数:35  
标签:Trie ++ son int str 字符串 节点

Trie树(字典树)

Trie树,是使用树形结构来存储字符串的一种方式,由于使用了树形结构,大大加快了字符串的存储以及多次查询的速度。
Trie树一般用于多字符串存储 , 以及查询一个字符串的出现次数时使用,或者查询以某段字符为前缀的字符串也可。

关于trie树的构造以及树形图像,请看这篇博客
Trie树(前缀树、字典树)

这里仅给出了代码实现。同时树形结构的建立使用静态数组模拟。

相关参数定义如下

#define root 0//规定节点0为根节点,不存储任何关系
const int N = 1e6 + 20;
int son[N][26], cnt[N], idx;
//son数组是树形结构数组。其第一维代表着一个节点,而第二维度来表征节点之间的关系
//比如son[0][0] = 1 代表着根节点有一个孩子节点,其中存储的值为'a',其所位于的位置为编号为1的节点。
//而cnt数组用于标记字符串结尾。当该节点为所插入字符串的最后一个字符时,cnt[该节点]++,即以该节点结尾的字符串数量加1
//idx永远指向下一个未使用的节点索引,用于扩展节点时用
//这里规定当节点值为0时为空节点

向trie树中插入一个字符串的操作如下

void insert(string str)
{
	int p = root;//从根节点开始找
	for (int i = 0; i < str.size(); i++)
	{
		int u = str[i] - 'a';//将ascill码转换为索引值(0-25 对应 a - z)
		if (!son[p][u]) son[p][u] = ++idx; //若该节点没有索引为u的孩子节点,则创建该节点
		p = son[p][u];//继续向下查找
	}
	cnt[p]++;//插入结束,将以最后节点为结尾的字符串数量++
}

从trie树中查询目标字符串个数操作如下

int query(string str)
{
	int p = root;//依旧从根节点开始查找
	for (int i = 0; i < str.size(); i++)
	{
		int u = str[i] - 'a';
		if (!son[p][u]) return 0;//有一位字符没有找到,即可确定trie树中未存储该字符,直接返回该字符串数量为0
		p = son[p][u];//若能找到,就继续
	}
	return cnt[p];//返回以最后一个节点为结尾的字符串数量
}

标签:Trie,++,son,int,str,字符串,节点
From: https://www.cnblogs.com/CrescentWind/p/17897998.html

相关文章

  • trie字典树
    维护一个字符串集合,支持两种操作:Ix向集合中插入一个字符串\(x\);Qx询问一个字符串在集合中出现了多少次。所有输入的字符串总长度不超过\(10^5\)(也就是节点数)constintN=100010;intn;chars[N];intch[N][26],cnt[N],idx;voidinsert(char*s){intp=0;......
  • Trie
    \(N\)为所有字符串的最大长度和,\(M\)为字符集大小,\(idx\)用于分配节点编号。\(n\)为字符串长度,\(t[k][u]\)表示节点\(k\)且出边为\(u\)的另一侧节点编号。\(insert\):插入字符串,时间复杂度\(O(n)\)。\(visit\):遍历字符串,遍历方式和内容无定式,按需遍历。structTrie{intt......
  • CW初中-C102B(加强版)(CF1720D2-Trie树)
    前言这道题的弱化版CF1720D1出现在模拟赛上,大家都用了弱化版的思路即向前扫描256个元素暴力计算DP。如果想具体了解的就去看看弱化版的题解吧。但弱化版的思路(除DP外)在此题几乎毫无落脚之地,甚至毫无关系。我在考场上曾对$0\leqa_i\leq10^2$感到了疑惑——甚至都没......
  • 可持久化Trie树(字典树)
    举例子:插入cat:插入cup:插入soup:插入cut:可持久化数据结构的重要问题就是解决区间的查询问题:例题,洛谷4735: M个操作,操作1:添加操作,添加一个树x,序列长度+1操作2:询问操作,找到一个位置p,满足l<=p<=r,使得a[p]^a[p+1]^...^a[N]^x最大,输出最大值 分析:令S[k]=a......
  • AcWing 835. Trie字符串统计
    题面:维护一个字符串集合,支持两种操作:①Ix向集合中插入一个字符串x;②Qx询问一个字符串在集合中出现了多少次。共有\(N\)个操作,所有输入的字符串总长度不超过\(105\),字符串仅包含小写英文字母。原题链接:835.Trie字符串统计-AcWingTrie字典树[1]//输入:Idog......
  • trie树
    用于字符串的插入和查询1.acwing8351#include<bits/stdc++.h>2usingnamespacestd;34constintN=100010;5intson[N][26];//trie树中每个点的所有儿子6intcnt[N],idx;//以当前这个点为结尾的单词有多少个;表示当前用到了哪个下标,idx=0即是根节点......
  • 【11月LeetCode组队打卡】Task2--TrieTree
    字典树Trie音同try,又称前缀树,是一颗有根树,根节点到树节点的一个路径就代表一个单词,多用于关键词检索,自动补完和拼写检查用空间换时间:借公共前缀来降低查询时间的开销根节点无内容(参考:字典树TrieTree图文详解——CSDN实现Trie题解——力扣)208.实现Trie复习一下this......
  • 【论文阅读笔记】【Image Retrieval】 Global Features are All You Need for Image R
    SuperGlobalICCV2023读论文思考的问题论文试图解决什么问题?图片检索方法通常由粗粒度图片检索和精确的结果重排列两个模块组成。人们通常认为图片的localfeature在结果重排列中是不可或缺的,但对大量的localfeature的计算需要较高的计算资源和时间能否只用图片......
  • Object.entries()
    Object.entries()方法返回一个给定对象自己的字符串键值对的数组。constobj={a:"aa",b:"bb",c:"cc"};console.log(Object.entries(obj),"Object.entries(obj)Object.entries(obj)");打印显示是这样[["a",......
  • Trie 树
    Trie树是一颗像字典一样的树。在Trie树上用边来表示字母,一个节点到另一个节点的边就是一个字母。实现:点击查看代码voidinsert(chars[]){ intu=0,len=strlen(s); for(inti=0;i<len;i++){ intv=gt(s[i]); if(!son[u][v])son[u][v]=++cn......