参考文献:算法导论
有限自动机包含一个五元组(Q, q0, A, ∑, δ)
Q表示状态有限集
q0为初始状态(q0 ∈Q)
A表示接受状态的集合(A 是Q的子集)
∑是输入字母表
δ是状态转移函数
*对于终态函数我还不是很理解,希望大家不吝赐教
算法导论上有一个例子
P = ababaca
那么转换成五元组是
Q = {
0:, (表示第1个字符不符合)
1:|a, (表示前1个字母符合)
2:a|b, (表示前2个字母符合)
3:ab|a, (表示前3个字母符合)
4:aba|b,
5:abab|a,
6:ababa|c,
7:ababac|a
}
q0 = 0:(注:0状态什么都没有)
A = {7:ababaca}
∑ = {a,b,c}
δ
我们可以画一个状态变换图
状态 | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7
a | 1 | 1 | 3 | 1 | 5 | 1 | 7 | 1
输入 b | 0 | 2 | 0 | 4 | 0 | 4 | 0 | 2
c | 0 | 0 | 0 | 0 | 0 | 6 | 0 | 0
这个状态转换表告诉我们
0状态输入一个a变成1状态
1状态输入一个a还是1状态(即aa中第二个a任然处于1状态),输入一个b在进入2状态(此时序列为ab)
2状态输入一个a进入3状态(此时序列为aba),输入一个b进入0状态(此时序列为abb,不符合状态3,并且最后一个字母为b,也不符合状态1)
以此类推
也就是说对于任意一个字符串,我们只要知道其模式串的状态转换图,也就可以通过当前状态和输入确定下一状态,也就是说我们可以知道有多少个字符符合模式前缀,那么我们仅遍历一遍字符串,则可以找出匹配的模式串
例如
T[i] = a b a b a b a c a b a
状态 0 1 2 3 4 5 4 5 6 7 2 3
那么有限自动机的关键就是计算模式串的状态转移函数(在此之前,需要先计算模式串的输入字母表)
COMPUTE_TRANSITION_FUNCTION(P, ∑)
m <- lenght[P]
for q <- 0 to m
do for each character a ∈ ∑
do k <- min( m+1, q+2)
repeat k <- k-1
until Pk
δ(q, a) <- k
return δ
(上面算法格式一致有问题,如果大家有兴趣可以直接参考算法导论)