字符串匹配(string matching)算法之二:利用有限自动机

上一篇:字符串匹配(string matching)算法之一 (Naive and Rabin_Karp)


有限自动机:

一个有限自动机M是一个5元组(Q, q0, A, Σ, δ), 其中:

·         Q是状态的有限集合

·         q0 Q 初始状态

·         A Q 是一个接受状态的集合

·         Σ 有限的输入字母表

·         δ 是从Q × Σ Q的函数, 称为M的转移函数(transition function )

有限自动机开始于状态q0,每次读入输入字符串的一个字符.

如果在状态q时读入输入字符a,则它从状态q变为δ(q, a).

当其当前状态q属于(接受状态的集合)A, 则说自动机M接受了迄今为止所读入的字符串.

没有被接受的输入称为被拒绝的输入.

有限自动机M可以推导出一个函数φ称为终态函数。φ(w)M在扫描字符串w后终止时的状态。

φ(ε)

=

q0,

φ(wa)

=

δ(φ(w), a) for w ∈ Σ*, a ∈ Σ.

因此, M接受字符串w当且仅当φ(w) A

 

字符串匹配自动机

给定模式P[1 m], 定义辅助函数σ数相应P的后缀函数.

函数σ是一个从Σ*{0, 1, . . . , m}上的映射:

σ(x)x的后缀且是p的最长前缀的长度.

σ(x) is the length of the longest prefix of P that is a suffix of x:

σ(x) = max {k : Pk x}.

例如模式P = ab, σ(ccaca) = 1, and σ(ccab) = 2

对一个长度为m的模式P来说, σ(x) = m 当且仅当 P x (Px的后缀).

给定模式P[1..m], 其对应的字符串匹配自动机的定义如下:

l        状态集Q{0, 1, …, m}, 初始状态q0, 状态m是唯一的接受状态.

l        对任意的状态q和字符a, 变迁函数δ的定义为: δ(q, a) = σ(Pqa). (其中PqP的前缀P[1..q])

也就是把状态q设为当前已匹配的长度.

例如模式P=ababaca.   文本T=abababacaba.

δ(5, b) = 4, 如果从状态q=5时自动机读入一个b, Pqb=ababab, 于是ababab的后缀匹配P的最长前缀为P4 = abab.

The longest prefix of P that is also a suffix of ababab is P4  = abab

 

//字符串匹配自动机
FINITE-AUTOMATON-MATCHER(T, δ, m)
   
   
1  n  length[T]
   
   
2  q  0
   
   
3  for i  1 to n
   
   
4      do q  δ(q, T[i])    //δ函数其实是一张表,预先计算出所有值,需要时查询
   
   
5         if q = m
   
   
6            then print "Pattern occurs with shift" im
   
   

   
   
    
     
   
   
匹配时间复杂度Θ(n).
   
   

   
   
    
     
   
   
//下面计算出δ函数
  
  
COMPUTE-TRANSITION-FUNCTION(P, Σ)
   
   
1 m  length[P]
   
   
2 for q  0 to m
   
   
3     do for each character a  Σ
   
   
4            do k  min(m + 1, q + 2)
   
   
5               repeat k  k - 1
   
   
6                 until Pk  Pqa
   
   
7               δ(q, a)  k
   
   
8 return δ
    
    
时间复杂度O(m3 |Σ|)..还存在更快的过程。
  
  

 

附录:

Σ* 表示用字母表Σ中的所有有限长度的字符串的集合

长度为0的空字符串用ε表示,ε也属于Σ*

字符串前缀  后缀

如果某个字符串 y Σ*,使得xwy ,则称wx的前缀, 记为w x 如果wx的后缀,记为w x

Introduction to Algorithms- CLRS



width="728" scrolling="no" height="90" frameborder="0" align="middle" marginwidth="0" marginheight="0" src="http://download1.csdn.net/down3/20070601/01184120111.htm">
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值