1. Trie 字典树基础知识
(1)什么是字典树
Trie 字典树指的是:某个字符串集合构造的又有根树。由于 Trie 字典树,较好的利用了字符串的公共前缀,因此有效的节约存储空间。
Trie 树典型应用是:用于统计,排序和保存大量的字符串(但不仅限于字符串),所以经常被搜索引擎系统用于文本词频统计。它的优点:利用字符串的公共前缀来减少查询时间,最大限度地减少无谓的字符串比较,查询比哈希树高。
它有 3 个基本性质:
A、根结点不包含字符,除根结点外每一个结点都只包含一个字符;
B、从根结点到某一结点,路径上经过的字符连接起来,为该结点对应的字符串;
C、每个结点的所有子结点包含的字符都不相同。
(2)字典树的时间复杂度、空间复杂度:
时间复杂度:
假设所有字符串长度之和为 n,则构建字典树的时间复杂度为 O( n )。
假设要查找的字符串长度为 k,则查找的时间复杂度为 O( n )。
空间复杂度:
字典树每个结点都需要用一个数组来存储子结点的指针,即便实际只有两三个字结点,但依然需要一个完整大小的数组。所以,字典树比较消耗内存,空间复杂度较高。
比如:按上述实现方式,假设有 n 个小写字母的字符串,总长度 ≤ ,则空间复杂度为: 。
2. AC自动机
(1) AC自动机的原理
AC自动机:Aho - Corasick automation,该算法在 1975 年产生于贝尔实验室,是著名的多模式串匹配算法之一。一个常见的例子就是给出 n 个单词,再给出一段包含 m 个字符的文章,让你找出有多少个单词在文章里出现过。
要搞懂 AC自动机,先得有字典树 Trie 和 KMP 模式匹配算法的基础知识。KMP 算法是单模式串的字符匹配算法,AC自动机是多模式串的字符匹配算法。
(2)AC自动机的构造:
1. 构造一棵 Trie ,作为 AC自动机的搜索数据结构。
2. 构造 next指针,使当前字符失配时跳转到具有最长公共前后缀的字符继续匹配。如同 KMP 算法一样,AC自动机在匹配时如果当前字符匹配失败,那么利用 next 指针进行跳转。由此可知如果跳转,跳转后的串的前缀,必为跳转前模式串的后缀并且跳转到新位置的深度(匹配字符个数)一定小于跳之前的结点。所以我们可以利用 bfs 在 Trie 上上面进行 next 指针的求解。
如果要求 k 号节点的 next 值:
(1)看 k 号结点父节点的 next 值 —> j 。
(2)判断 j 是否有某个子结点的值和 k 号节点的值相同
A、有,next [ k ] 指向对应的子结点
B、没有,j = next [ j ] 继续回跳,直接跳到根。
3. 扫描主串进行匹配。
AC自动机相当于:Trip + KMP 的组合。
AC自动机,可以优化为 Trip 图。
最后
制作不易,点个赞吧!!!
制作不易,点个赞吧!!!
制作不易,点个赞吧!!!