Q:Finite Automaton?,我根本就没有听说过这种数据结构,毫不关心无压力.jpg
A:这个还是有点儿用处的,等一下我会讲的,你就当涨知识了吧。
Q:呼噜噜~~~~~~
A:睡好。。。
在讲解Finite Automaton之前我们先介绍一下朴素字符串匹配算法
朴素字符串匹配算法就是通过一个循环找到所有的有效偏移,对于n-m+1个可能的s,我们需要检测P[1...m]==T[s+1,s+m]。
朴素字符串伪代码如下:
Naive_String_Matcher(T,P)
n=T.length
m=P.length
for s = 0 to n-m
if p[1...m] == T[s+1,s+m]
print("Pattern occurs with shift" s
朴素字符串有两层循环,第一层 0到n-m,第二层 1到m,故总的时间复杂度为O((n-m+1)*m)。
想一下,我们在朴素字符串匹配算法中,一旦匹配失败,就向右偏移一个单位,然后开始重新匹配,那么之前匹配上的那些字串又得重新匹配,那么有没有什么办法可以记录之前匹配的信息,下面有请 Finite Automaton
一个有限自动机M是一个5元组(Q,q, A, ∑,δ)
Q是状态的有限集合
q∈Q是一个初始状态
A包含于Q是一个特殊的接受状态集合
∑是有限输入字母表
δ是一个从Q✖∑到Q的函数,称为M的转移函数
我们用下图来详解有限自动机
图a为有限自动机的状态图。
图b是一个状态函数表,它表示了在有限自动机图中的所有状态。
图c是文本T在自动机上面的操作。
有限自动机就是利用模式串P与自己匹配来创建的自动机,相对应的匹配算法可以理解为通过文本串T中的字符来走如图a所示的地