AC自动机原理 关键点 fail指针

前提

已经了解基础的Trie树,进一步看下AC自动机比Trie树牛皮在哪里,其实就是牛皮在fail指针可以减少匹配次数

参考

b站大法好
code
极客时间
github code

例子

好的例子是成功的一半

这个图很好地说明了fail指针的原理,还是看视频理解的好

几个关键点:

构建fail指针的时候

层次遍历构建fail指针

根节点,以及根节点的儿子,没有所谓最长后缀,fail节点都指向root

遍历到某个节点,就看父节点的fail指针fafail,如到4号的时候,看父节点2号的fail指针root的孩子,发现没有e,4号的fail也指向root;到6号的嘶吼,发现父节点3的fail指针是root,root有子节点h是2,所以6.fail=2;到9号,发现父节点6的子节点有e(4),所以9.fail=4

查找代码怎么写

在这里插入图片描述
在这里插入图片描述

可以看到都是一个套路

0.for循环遍历输入
1、一个while循环,沿着fail指针找
2、退出while循环的时候,要么是沿着fail节点找到了下一个字符(那就移动到树的子节点),要么就是直接回到root(这样就在root打转检查输入的下一个字符)
3、然后就检查一下是不是结束的节点就好了,是的话输出。

细节

这里有个关键细节,b站的实现中,每个节点要记录多个单词的匹配。如下面的6号节点,既是she的结尾,也是he的结尾,记录的长度信息[3,2](需要跟fail节点3号的[2]关联上)。如果没有这个信息会造成奇怪的bug,我们还真遇到过了,
如词表=[ycwc,cw],q=ycw,ycwc的w节点需要记录自身也是一个终结节点,最后输出,不然就会造成匹配失败。
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
有限自动机(Finite Automaton)是一种抽象的计算模型,它是由一个有限的状态集合、一个有限的输入字母表、一个转移函数和一个初始状态组成的。其能够接受一个输入字符串,并在每个状态上进行转移,最终根据终止状态的定义判断该字符串是否被该自动机接受。有限自动机是计算机科学中的一个重要概念,广泛应用于编译器、网络安全等领域。 AC自动机是一种基于有限自动机的字符串匹配算法,它可以在一个文本串中同时查找多个模式串。它的原理是将多个模式串构造成一个有限自动机,然后在文本串上进行状态转移。当某一状态为终止状态时,即表示匹配到了一个模式串。AC自动机的优点是可以大大降低匹配的时间复杂度,特别适用于需要匹配多个模式串的场合。 AC自动机的设计与实现主要包括以下步骤: 1. 构造Trie:将所有模式串构造成一棵Trie。 2. 构造Fail指针:对Trie进行广度优先遍历,为每个节点构造Fail指针,使得每个节点的Fail指针指向其在Trie上的最长后缀节点。 3. 进行状态转移:在文本串上进行状态转移,即从根节点开始,根据输入字符在Trie上进行状态转移,同时根据Fail指针进行状态的回溯。 4. 输出匹配结果:当某一状态为终止状态时,即表示匹配到了一个模式串,将该模式串的编号输出即可。 AC自动机的时间复杂度为O(n+∑len[p]),其中n为文本串长度,len[p]为所有模式串的长度之和。由于AC自动机的实现较为复杂,因此通常采用现有的AC自动机库进行开发。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值