如何申请一个网站 做视频,wordpress显示文章列表的主题,西地那非片是什么药,浦江网站建设微信开发GPT的介绍
#x1f9e0; 一句话总结#xff1a; 字典树是一种专门用来存很多字符串的“超级前缀树”#xff0c;查找某个字符串或前缀的时候#xff0c;特别快#xff01; ✍️ 举个生活例子#xff08;类比#xff09;#xff1a;
你想做一个词典#xff08;Dictio…GPT的介绍 一句话总结 字典树是一种专门用来存很多字符串的“超级前缀树”查找某个字符串或前缀的时候特别快 ✍️ 举个生活例子类比
你想做一个词典Dictionary里面有这些单词
apple
app
april
bat
ball
banana你现在想知道
“apple”在不在词典里 ✅“app”是某个单词的前缀吗✅有没有以 “ba” 开头的单词✅
如果你把这些单词一个个拿出来比那太慢了。
于是我们把它们塞进一个神奇的数据结构字典树。 字典树长啥样
我们用“树”的形式来表示字符串的每个字母从根节点一层一层往下走 (根)/a/p/ \p r/ \l i/ \e l另一边b/ \a a/ \l n/ \l a\n\a每个节点代表一个字母每条路径代表一个字符串
每个节点有cnt表示以这个节点为结尾的字符串的个数 字典树的速度怎么样
普通查找字符串在数组里时间是O(字符串长度 × 数组长度)字典树查找时间是O(字符串长度)和多少单词没关系 形象一点说
数组/哈希表像是一页一页翻字典字典树像是按字母顺序直接走向目标
就像 Google 搜索你输入 ap它能秒给你推荐 apple、app store、april —— 这背后可能就是字典树 总结一张图
apple, app, april 共享前缀 ap↓
Trie 就是把这些前缀共享像搭积木一样拼起来↓
节省空间 查询高效模板
N一般开到2e510就足够了
0表示根节点 不存任何字符 是空节点
Trie 根节点永远不表示任何字母根节点只是一颗“无名的树根”它是连接所有字母的“共同出发点”它不存任何字符也不是任何单词的一部分
idx表示给当前字符分配编号 [根0]/ \a b↓ ↓p a↓ ↓p n↓ ↓l a↓ ↓e n↓aconst int N 1e5 10; // 最大节点数字符串数量×平均长度
int son[N][26]; // 每个节点的26个子节点用下标表示
int cnt[N]; // cnt[i] 表示以 i 号节点结尾的单词个数
int idx 0; // 当前用到的节点编号0 是根// 插入字符串
void insert(const string s) {int p 0;for (char c : s) {int u c - a;if (!son[p][u]) son[p][u] idx; // 创建新节点p son[p][u];}cnt[p]; // 这个节点是一个完整单词的结尾
}
// 查询字典树中插入了几个s
int query(const string s) {int p 0;for (int i 0; i s.size(); i) {int u s[i] - a;if (son[p][u] 0) {return 0;}p son[p][u];}return cnt[p];
}查询是否存在以prefix 为前缀的字符串
bool startsWith(string prefix) {int p0;for(auto c:prefix){int uc-a;if(son[p][u]0) return 0;pson[p][u];}return 1;
}