字符串匹配——有限自动机

参考文献:算法导论


有限自动机包含一个五元组(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 δ

(上面算法格式一致有问题,如果大家有兴趣可以直接参考算法导论)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值