字典树(trie) 算法笔记
P1 字典树是什么:
顾名思义就像一个字典一样,可以查询某单词是否出现,也可以查找同一前缀的单词的个数等等操作。
P2 字典树的实现:
字典树是用树来实现的(这不废话吗),如果从根节点走到一个已标记过的节点(后面我们会称它为单词节点)的一条路径就是一个单词。
我们定义一下变量(或数组)的表示含义:
: 表示当前一共有多少个节点。 : 表示 节点的走 这条路径的下一个节点。 : 表示 是否为单词节点。 : 表示 节点的属性(权值),这个数组可有可无(通常为经过此节点的次数)。
很快我们就可以写出插入字符串,和查询字符串是否存在的代码,代码如下:
void insert(string s, int p = 0) {
for (int i = 0, c; i < s.size(); i++) {
c = ToId(s[i]); // ToId为字符转整数的函数
!nex[p][c] && (nex[p][c] = ++tot); // 若没有此节点,开辟新节点
p = nex[p][c] /*往下走*/, cnt[p]++; // 此处cnt为上述的deta,为经过此节点的次数
}
exist[p] = 1; // 将此节点标记为但此节点
}
bool query(string s, int p = 0) {
for (int i = 0, c; i < s.size(); i++) {
c = ToId(s[i]);
if (!nex[p][c]) {
return 0;
} // 没有路了没有此单词
p = nex[p][c]; // 往下走
}
return exist[p];
} // query的含义可以改变,此处是查询此字符串是否存在
很容易发现这个数据结构是一个用空间来换时间的数据结构,空间复杂度为:
P3 例题解析:
Luogu - P8306 【模板】字典树
题目描述:给你一些
这道题让你求以某个字符串为前缀的字符串的个数,我们在插入字符串的时候,可以记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】