AC自动机:多模式匹配

版权声明:欢迎评论交流,转载请注明原作者。 https://blog.csdn.net/m0_37809890/article/details/89196518

参考资料
2018XJTU小学期课程day9-字符串_zbh

前置知识
KMP算法:单模式匹配
Trie树

多模式匹配:给定多个模式串,查询一个文本串中是否存在每个模式串。

自动机
自动机是一个五元组,包括

  1. 状态集合 D D
  2. 符号表 Σ \Sigma
  3. 开始状态 S D S\in D
  4. 结束状态集合 T D T\subseteq D
  5. 转移函数 δ \delta ,例如 δ ( Q , a ) = P \delta(Q,a)=P 表示状态 Q Q 通过符号 a a 到达状态 P P .

自动机实际上是一张有向图,以下默认节点0为开始状态,边缘加粗的节点为结束状态。
在这里插入图片描述
对于给定的串 S S ,从开始状态出发,沿边上对应的字符前进,如果最后处于结束状态,称为该自动机接收字符串 S S ,否则称为拒绝 S S .

单模式匹配自动机的构建
状态集合:自动机状态 i i 表示已经匹配了前i个字符,最后一个状态是结束状态。
符号表:字符串的符号表
转移构造:

  1. 对于状态 i i ,符号 a a ,若 s [ i + 1 ] = a s[i+1]=a ,则 δ ( i , a ) = i + 1 \delta(i,a)=i+1 ;
  2. 否则, j j i i 开始,不断令 j = f a i l [ j 1 ] j=fail[j-1] ,直到 s [ j ] = a s[j]=a ,此时 δ ( i , a ) = j + 1 \delta(i,a)=j+1
  3. 若最后 j = 0 j=0 s [ j ] ! = a s[j]!=a ,则 δ ( i , a ) = 0 \delta(i,a)=0 .
  4. 在实际应用中,往往要找到文本中的所有模式串,所以结束状态也要加上转移。

举例子:为字符串ababb构建单模式匹配自动机
在这里插入图片描述
多模式匹配自动机(AC自动机)的构建
状态集合:将模式串集合构建成一棵Trie树,Trie树的节点集就是自动机的状态集。

猜你喜欢

转载自blog.csdn.net/m0_37809890/article/details/89196518