AC自动树

回顾/本期梗概

        上期我们学习了Trie 字典树(空降链接),本期我们将学习AC自动树。


1、AC自动机的原理

        AC自动机:AHo-Corasick automation ,该算法在1975年产生于贝尔实验室,是著名的多模式匹配算法之一。一个常见的例子就是给出n个单词,再给出一段包含m个字符的文章,让你找出有多少个单词在文章里出现过。

        要搞懂AC自动机,先得有字典树 Trie 和 KMP 模式匹配算法的基础知识。KMP算法是单模式串的字符匹配算法,AC自动机是多模式串的字符匹配算法。

        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 图。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值