字符串匹配(string matching)算法之二:利用有限自动机
2012-11-01 09:55
489 查看
有限自动机:
一个有限自动机M是一个5元组(Q, q0,A,
Σ, δ),其中:
<!--[if !supportLists]-->· <!--[endif]-->Q是状态的有限集合
<!--[if !supportLists]-->· <!--[endif]-->q0∈
Q 初始状态
<!--[if !supportLists]-->· <!--[endif]-->A⊆Q
是一个接受状态的集合
<!--[if !supportLists]-->· <!--[endif]-->Σ有限的输入字母表
<!--[if !supportLists]-->· <!--[endif]-->δ是从Q
× Σ 到Q的函数,称为M的转移函数(transition function )
有限自动机开始于状态q0,每次读入输入字符串的一个字符.
如果在状态q时读入输入字符a,则它从状态q变为δ(q,a).
当其当前状态q属于(接受状态的集合)A时,则说自动机M接受了迄今为止所读入的字符串.
没有被接受的输入称为被拒绝的输入.
有限自动机M可以推导出一个函数φ,称为终态函数。φ(w)是M在扫描字符串w后终止时的状态。
因此, M接受字符串w当且仅当φ(w)∈
A
字符串匹配自动机
给定模式P[1
‥ m], 定义辅助函数σ数相应P的后缀函数.
函数σ是一个从Σ*到{0, 1, . . . ,m}上的映射:
σ(x)是x的后缀且是p的最长前缀的长度.
σ(x) is the length of the longest prefix ofP that is a suffix of
x:
σ(x) = max {k :Pk
⊐x}.
例如模式P =
ab, σ(ccaca) = 1, andσ(ccab) = 2
对一个长度为m的模式P来说,σ(x) =
m 当且仅当 P
⊐x
(P是x的后缀).
给定模式P[1..m], 其对应的字符串匹配自动机的定义如下:
<!--[if !supportLists]-->l <!--[endif]-->状态集Q为{0,
1, …, m},初始状态q0,状态m是唯一的接受状态.
<!--[if !supportLists]-->l <!--[endif]-->对任意的状态q和字符a,变迁函数δ的定义为:δ(q,
a) = σ(Pqa). (其中Pq是P的前缀P[1..q])
也就是把状态q设为当前已匹配的长度.
例如模式P=ababaca. 文本T=abababacaba.
有δ(5,b) = 4,
如果从状态q=5时自动机读入一个b,则Pqb=ababab,
于是ababab的后缀匹配P的最长前缀为P4=
abab.
(The longest prefix ofP that is also a suffix of
ababab is P4 =
abab)
附录:
用Σ*表示用字母表Σ中的所有有限长度的字符串的集合
长度为0的空字符串用ε表示,ε也属于Σ*
字符串前缀 后缀
如果某个字符串 y∈
Σ*,使得x=wy,则称w是x的前缀,记为w⊏x
。如果w是x的后缀,记为w⊐x
《Introduction to Algorithms》-
CLRS
一个有限自动机M是一个5元组(Q, q0,A,
Σ, δ),其中:
<!--[if !supportLists]-->· <!--[endif]-->Q是状态的有限集合
<!--[if !supportLists]-->· <!--[endif]-->q0∈
Q 初始状态
<!--[if !supportLists]-->· <!--[endif]-->A⊆Q
是一个接受状态的集合
<!--[if !supportLists]-->· <!--[endif]-->Σ有限的输入字母表
<!--[if !supportLists]-->· <!--[endif]-->δ是从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 ∈ Σ. |
A
字符串匹配自动机
给定模式P[1
‥ m], 定义辅助函数σ数相应P的后缀函数.
函数σ是一个从Σ*到{0, 1, . . . ,m}上的映射:
σ(x)是x的后缀且是p的最长前缀的长度.
σ(x) is the length of the longest prefix ofP that is a suffix of
x:
σ(x) = max {k :Pk
⊐x}.
例如模式P =
ab, σ(ccaca) = 1, andσ(ccab) = 2
对一个长度为m的模式P来说,σ(x) =
m 当且仅当 P
⊐x
(P是x的后缀).
给定模式P[1..m], 其对应的字符串匹配自动机的定义如下:
<!--[if !supportLists]-->l <!--[endif]-->状态集Q为{0,
1, …, m},初始状态q0,状态m是唯一的接受状态.
<!--[if !supportLists]-->l <!--[endif]-->对任意的状态q和字符a,变迁函数δ的定义为:δ(q,
a) = σ(Pqa). (其中Pq是P的前缀P[1..q])
也就是把状态q设为当前已匹配的长度.
例如模式P=ababaca. 文本T=abababacaba.
有δ(5,b) = 4,
如果从状态q=5时自动机读入一个b,则Pqb=ababab,
于是ababab的后缀匹配P的最长前缀为P4=
abab.
(The longest prefix ofP 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" i – m
匹配时间复杂度Θ(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∈
Σ*,使得x=wy,则称w是x的前缀,记为w⊏x
。如果w是x的后缀,记为w⊐x
《Introduction to Algorithms》-
CLRS
相关文章推荐
- 字符串匹配(string matching)算法之二:利用有限自动机
- 算法-字符串匹配(String Matching)-(2)-有限自动机
- 字符串匹配算法——利用有限自动机进行匹配
- 字符串匹配算法 之 基于DFA(确定性有限自动机)的字符串模式匹配算法
- 利用有限自动机进行字符串匹配
- 字符串匹配算法 之 基于DFA(确定性有限自动机)
- 第32章 :字符串匹配—有限自动机算法,Knuth-Morris-Pratt算法
- 算法——字符串匹配之有限自动机算法
- 利用有限自动机进行字符串匹配
- 利用有限自动机进行字符串匹配
- 利用有限自动机进行字符串匹配
- 字符串匹配算法 之 基于DFA(确定性有限自动机)的字符串模式匹配算法
- 字符串匹配算法 之 基于DFA(确定性有限自动机)的字符串模式匹配算法
- 4种字符串匹配算法:有限自动机(中)
- 利用有限自动机进行字符串匹配
- 多模字符串匹配算法之AC自动机—原理与实现
- 字符串匹配(string matching)算法之一 (Naive and Rabin_Karp)
- 字符串匹配算法SMA 总结之四:自动机算法
- 字符串匹配之有限自动机&kmp算法