首页 > 代码库 > AC自动机
AC自动机
关于自动机,其实可以最简单的理解为,对于一个给定的初始状态,算法可以自动进行递归得出最终匹配或者不匹配两种情况。AC自动机试自动机的一种(Aho-Corasick automation),该算法在1975年产生于贝尔实验室,是著名的多模匹配算法之一。所谓多模匹配,指的是同时匹配多个模式串,我们通常使用字符串匹配KMP算法其实是AC自动机的一种特殊情况,它只在一个时间内匹配一个模式串。了解这个关系之后,AC自动机的理解就相对容易了。
具体操作:
1,将所有待匹配的字符串构造一个Trie,作为AC自动机的搜索数据结构。例如,5个单词,say,she,shr,he,her。构造的Trie应该为(图片来源于网络)。
2,构造fail指针,使当前字符失配时跳转到具有最长公共前后缀的字符继续匹配。跟 KMP算法中的next相似, AC自动机在匹配时如果当前字符匹配失败,那么利用fail指针。
3,构造好Trie和失败指针后,我们就可以对主串进行扫描了。这个过程和KMP算法很类似,但是也有一定的区别,主要是因为AC自动机处理的是多串模式,需要防止遗漏某个单词,所以引入temp指针。
匹配过程分两种情况:(1)当前字符匹配,表示从当前节点沿着树边有一条路径可以到达目标字符,此时只需沿该路径走向下一个节点继续匹配即可,目标字符串指针移向下个字符继续匹配;(2)当前字符不匹配,则去当前节点失败指针所指向的字符继续匹配,如果最终指针指向root结束,说明没有匹配的字符串。重复这2个过程中的任意一个,直到模式串走到结尾为止。
对照上图,看一下模式匹配这个详细的流程,假设主串为yasherhs,我们需要求模式串在主串中出现的次数。对于i=0,1。Trie中没有对应的路径,故不做任何操作;i=2,3,4时,指针p走到左下节点e。因为节点e的count信息为1,所以count+1,并且将节点e的count值设置为-1,表示改单词已经出现过了,防止重复计数,最后temp指向e节点的失败指针所指向的节点继续查找,以此类推,最后temp指向root,退出while循环,这个过程中count增加了2。表示找到了2个单词she和he。当i=5时,程序进入第5行,p指向其失败指针的节点,也就是右边那个e节点,随后在第6行指向r节点,r节点的count值为1,从而count+1,循环直到temp指向root为止。最后i=6,7时,找不到任何匹配,匹配过程结束。
AC自动机