码迷,mamicode.com
首页 > 其他好文 > 详细

利用有限自动机(finite automata)进行模式匹配

时间:2016-07-23 19:29:55      阅读:231      评论:0      收藏:0      [点我收藏+]

标签:

一.有限自动机定义及基本术语:

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

  • Q 是所有状态的有限集合;
  • 技术分享 ∈ Q (属于)是初始状态;
  • A ⊆ Q (子集)是接受状态的集合;(对应于多模式?)
  • Σ 是有限输入字母表;   
  • δ 是从Q * Σ的转移函数,称为有限自动机M的转移函数;


记号与术语:

  • Σ*  表示用字母表Σ中所有字符形成的所有有限长度的字符串集合.
  • n输入字符串(input string)的长度.
  • m模式字符串(pattern string)的长度;也称作终态m,当状态为m时表示,m长度的模式串匹配成功.
  • |x| : 字符串x的长度, 如示符号记法.
  • 技术分享: 字符串w 是字符串x 的前缀,如示符号记法.
  • 技术分享 : 字符串w 是字符串x 的后缀,如示符号记法.(注意前缀/后缀均遵循传递规则)
  • ε:表示空字符串,是所有字符串的后缀,前缀. (ε读作 epsilon )
  • a : 下文中的字符a泛指所有字符(a∈Σ),不特指字符‘a‘. 

二.引入的函数定义:

  转移函数δ(transition function)( δ 读作"delta",对应大写为 Δ ).有限自动机开始于初始状态技术分享,每次读入输入字符串的一个字符,如果有限自动机在状态q是读入字符‘a‘,  则M状态从q变成 δ(q, a);

  终态函数 Φ(finite state function)( Φ 读作"fai", 对应小写为 φ ) 是从 Σ* 到 Q 的函数,Φ(w)是永动机M 扫描字符串 w 终止后的状态;M 接受字符串w 当且仅当Φ(w)∈A, 函数Φ有下列递归关系定义:
    φ(ε) = q0;(空字符串 ε 的终态为q0)

    φ(wa) = δ(φ(w),a) (其中w∈Σ*,a∈Σ)

  辅助函数,后缀函数σ 对应于模式字串P ( σ 读作 "sigma", 对应大写为 Σ )是从Σ* 到{0,1, ..., m}上的映射,σ(x)是字符串x的后缀同时是P的前缀的最大长度;
    σ(x) = max{k: Pk ? x }
    有P0 = ε是所有所有字符串的后缀;
  注意:后缀函数的主要意义的是求出当前匹配失败时,求出已经匹配过的部分字串x是否是待匹配模式字串P的前缀,即匹配可以跳过x中部分长度( σ(x) ),可以用于实现转移过程;同时也表明在接受输入字符串x后的状态(终态),即也用于实现终态函数。
三、字符串匹配自动机(string-matching automation)
  下图是依据模式串 P="ababaca" 构建的自动机图表:
技术分享
  上图(a)是一个自动机的状态转换图表,接受所有以字符串"ababaca"结尾的字符串。其中状态0是初始状态,状态7是唯一接受状态(单模式匹配).

  • 从状态i到状态j的带箭头的有向边表示转移过程: δ(i, a) = j(a∈Σ).
  • 右向边组成了自动机的主要"骨架",图中粗线部分,对应于输入字符同模式字串匹配成功的转移过程。左向边对应于匹配失败的转移过程(跳转,主要是计算已经匹配的部分字串的后缀子串同时是模式串P的前缀的最大长度).部分匹配失败的过程没有标示出来。
  • 图中部分状态i在接受某字符a(a∈Σ)时,没有标示出对应有向边的情况表明其转移过程为: δ(i, a) = 0(a∈Σ),根据下面字符串模式匹配自动机定义,知当前已经匹配子串没有后缀字串是模式串P的前缀。如在状态3时,输入字符为‘c‘,即在已经匹配 了"aba"这时接受字符‘c‘,知当前已匹配字串为"abac",对应模式字串P="ababaca",可知这时匹配失败,进行失败跳转求"abac" 后缀子串同时是模式串P前缀的最大长度,可知为0.
  • 匹配成功的转移过程(对应状态,以及对应输入字符)均标示为灰色,
  •  表(c)是自动机在处理(接受)输入文本T="abababacaba"的最终状态表。当输入字符T[i]时,此时字串T[0...i]对应的的最终状态 φ(T[0...i]) 同表(c)最后一列一一对应。有T["abababaca"] = P.length = 7(唯一接受状态),即这时候在T串中匹配成功模式串P,结束位置为9,起始位置为(9-P.length+1)=3。

3.字符串匹配有限自动机定义:

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

  1. 状态集Q = {0,1,...m},开始状态q0 是状态0,state m 是唯一的接受状态;
  2. 转移函数δ 可以用后缀函数来表示 (这个很重要, 因为状态转移函数是个抽象概念,而后缀函数可以用code表示) :

    δ(q,a) = σ(Pq,a)   <等式一>
  假设当前已经读入的字符串为T,为了让T的字串(以T[i]为结尾) 能匹配模式字串Pj,必须满足Pj是Ti的后缀;同时假设q = φ(Ti),说明读取字串Ti后自动机M 状态变成q;同时根据转移函数<等式一>可知q是模式字串P最大长度的前缀,同时是Ti的后缀;因此在状态q,有Pq ? Ti 和 q = σ(Ti) (当q 等于m 时,说明模式字串P整个是Ti的后缀,也意味着匹配查找成功了),因此有σ(Ti)= q,得出永动机也支持下面的等式(终态函数也是抽象的,转化为后缀函数表达式后,可以用code表示):
   φ(Ti) = σ(Ti)(i = 0,1,...n)        <等式二>

  2同时有两个引理(具体证明可以参考算法导论):

    引理1、后缀函数不等式:

            σ(xa) ≤ σ(x) + 1 (对于任何字符串x,以及字母a)

    引理2、后缀函数递归引理:

        对于任何字符串x,以及字母a,如果q = σ(x),有:
            σ(xa) = σ(Pqa)


<等式二> 可以用数学归纳法证明,具体如下:
1、当i = 0,因为T0 = ε,因此有φ(Ti) = 0 = σ(Ti)
2、假设φ(Ti) = σ(Ti),证明φ(Ti+1) = σ(Ti+1),用q 表示φ(Ti),用字母a表示T[i+1],有:
φ(Ti+1) = φ(Tia) (Ti+1 == Tia)
             = δ(φ(Ti),a) (根据终态函数的定义)
            = δ(q,a) (根据q的定义)
            = σ(Pqa) (根据等式一)
            = σ(Tia) (根据引理二)
            = σ(Ti+1) (Ti+1 == Tia)


  从上面可以知道当读入T i 的终态(亦即读入T[i]后转移函数状态)等于模式长度,就匹配成功了,下面是有限自动机机匹配算法伪代码:
技术分享  下面就是根据<等式一>来实现转移函数的伪代码:
技术分享

利用有限自动机(finite automata)进行模式匹配

标签:

原文地址:http://www.cnblogs.com/wxgblogs/p/5699298.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!