AC算法---原理和Trie图基本一样

AC算法涉及到三个表:goto表,fail表,output表


goto表的构造output表也是伴随goto表一块构造的:(类似于Trie树的构造)

下面举例说明:

输入串:feng   fe    tao    ao

对于第一个字符串feng:


output表:4    feng

对于第二个字符串fe:


output表:2    fe

                 4    feng

对于第三个字符串tao:

AC算法---原理和Trie图基本一样_第1张图片

output表: 2    fe

                 4    feng

                  7    tao

对于第四个字符串ao:

AC算法---原理和Trie图基本一样_第2张图片

output表: 2    fe

                 4    feng

                 7    tao

                  9    ao


最后对于起始串自己向自己跳转。


fail表的构造此时也存在output表的更新:(类似于Trie图中找后缀结点)


设结点为i对应的跳转值为f(i),对于goto表中走不动的结点需要求解f(i):

f(i)的求解需要知道f(i-1)并且需要记录结点i的入边上的字符设为'x'那么f(i)就是结点f(i-1)出边上的字符为'x'所指向的结点,如果f(i-1)没有这么一条边那么就找f(i-1)的f(i-1)直到0结点也找不到这么一条边那么f(i)就等于0。这一套方法和Trie图的求解后缀结点是一样一样的。

fail表:

  i      1     2      3     4     5     6    7     8        9

f(i)     0     0      0     0     0     8    9     0        0

同时对output表的更新:如果f(i)是个输出结点那么i的output也要加入f(i)输出的内容,

例如:f(7)=9输出 ao

那么output表就变为了:

output表: 2    fe

                 4    feng

                 7    tao  ao

                  9    ao

这样三个表就建完了,AC自动机就是这样



你可能感兴趣的:(数据结构,AC自动机)