Trie详(?)解

· · 算法·理论

0.Trie介绍

Trie,即字典树、单词查找树,是一种使用空间换取时间的数据结构。 除了根节点(空字符),其它节点都是一个字符,所以字典树上的一条路径就是一个的字符串。也就是说,字符串共用一个前缀。

1.Trie的结构

以拥有字符串 aabcabcdbnmbrxlje 的一棵 Trie 为例(红色节点标志着这是一个字符串的最后字符,不然无法确认): 可以发现 Trie 每个字符串的最后字符在树上离 root 节点即这个字符串的长度。 Trie 的每个节点的儿子也只可能有字符集的大小个,一般来说,这个数不超过 256。 同时,Trie 最差的空间复杂度即 O(\sum M)M 代表字符串的长度),不难想到构造这样的例子只需要让前缀不同即可。

这里给出数组实现的代码(一样的,后文中我们也只使用数组实现):

struct TrieNode
{
    bool isend;//是否为字符串结尾
    int son[256];//子节点 
}t[200005];

2.Trie的基本操作

插入

例如我们将上图所示的 Trie 再插入一个字符串 aaa,Trie 就会变成: 操作顺序即:

备注:模板

洛谷P2580 于是他错误的点名开始了 算法或数据结构 时间复杂度(单次) 额外空间复杂度
暴力 O(\sum_{i=1}^n\|t_i\|) O(1)
Trie O(\|t_i\|) O(\sum_{i=1}^n\|t_i\|)
二分 O(n\sum_{i=1}^n\log{\|t_i\|}) O(1)
STL 库 map(平衡树) O(n\sum_{i=1}^n\log{\|t_i\|}) O(\sum_{i=1}^n\|t_i\|)

洛谷P4551 最长异或路径 洛谷P10471 最大异或对 The XOR Largest Pair

备注:01Trie

4.Trie的拓展

由于 Trie 的优越复杂度和树形的易拓展性,Trie 被应用于许多算法。例如 AC 自动机、01Trie 等算法,请读者自行了解。