- 4
- 0
- 约3.06千字
- 约 28页
- 2016-08-05 发布于湖北
- 举报
字符串匹配
2015.3.22
刘凯宇
大 纲
字符串匹配问题定义
朴素算法
Rabin-Karp算法
有限自动机算法
KMP算法
2
问题定义
文本 T[1…n] 长度 n
模式 P[1…m] 长度 m
m≤n
字母集 Σ={0,1} Σ={a,b,…,z}
0≤s≤n-m, T[s+1..s+m] = P[1..m]
模式P在文本T中出现,偏移为s。
3
字符串匹配算法
朴素算法
Rabin-Karp算法
有限自动机算法
KMP算法
4
朴素算法
模式 P[1..m]
0≤s≤n-m, T[s+1..s+m] = P[1..m]
思想:
P[1..m]
T[1..n]
文本 T[1..n]
s=0
s=1
…
s=n-m
…
5
?
文本 T = ababcabcacbab
模式 P = abcac
s = 0
s = 1
s = 2
s =3
s =4
s =5
T(n) = O((n-m+1)m)
6
7
字符串匹配算法
朴素算法
Rabin-Karp算法
有限自动机算法
KMP算法
7
Rabin-Karp算法
字符串31415
Σ = {0,1,2…9}
十进制数 31415
数值ts
模式 P[1..m]
思想:
文本子串 T[s+1..s+m]
数值p
0≤s≤n-m
有效偏移为s
T[s+1..s+m] = P[1..m]
8
文本 T = 258569236589780
p = 2365
ttt︸
模式 P = 2365
t0 =2585
︸
t1 =5856
…
︸
t6 =2365
模式P
数值p
?
T[s+1..s+m]
数值ts
?
数值ts+1
?
Σ = {0,1,2…9}
9
运用霍纳法则
ts+1= d(ts - dm-1T[s+1]) + T[s+m+1]
d = |Σ|
p = P[m] + d( P[m-1] + d( P[m-2] +…+ d(P[2] + dP[1])…))
t0 = T[m] + d(T[m-1] + d(T[m-2] +…+ d(T[2] + dT[1])…))
p = 5+10*(6+10*(3+10*2))=2365
t0=5+10*(8+10(5+10*2))=2585
Σ ={0,1,2…,9} d = 10
t1= 10(t0-103*2)+6 =5856
t2= 10(t1-103*5)+9 =8569
…
t6= 10(t5-103*9)+5 =2365
…
…
预处理时间
O(m)
10
= P[m] + d P[m-1] + d2P[m-2] + … + dm-2P[2] + dm-1 P[1]
p≡p%q ts ≡ ts%q
问题:p和ts的值可能太大
方法:p和ts的值取模q
ts+1 = ( d(ts-T[s+1]h)+T[s+m+1] )%q
h= dm-1 % q
11
for i=1 to m
p = (dp+P[i])%q
取模运算性质
(a + b)%c=(a%c+b%c)%c
(ab)%c=(a%c)(b%c)%c
ts+1={d(ts - dm-1T[s+1]) + T[s+m+1] }%q
=( d(ts-T[s+1]h)+T[s+m+1] )%q
(dm-1%q)
={ (d%q)[ (ts%q -
(T[s+1]%q)%q)%q]%q + T[s+m+1]%q }%q
12
若ts≠p
T[s+1..s+m]与模式P不匹配,偏移s无效
若ts=p
P与T成功匹配
s为有效偏移
T[s+1..s+m] = P[1..m]
T[s+1..s+m] ≠ P[1..m]
P与T不匹配
s为伪命中点
q=13
ts+1= ((31415-3*10000)*10+2)%13
= ((7-3*3)*10+2)%13
= 8
ts = 31415%13
= 7
文本T=2359023141526739921
p=31415%13 = 7
模式P=31415
8
9
3
11
0
1
7
8
4
5
10
11
7
9
11
…
…
…
伪命中点
合法匹配
匹配时间T(n)=O((n-m+1)m)
实际应用有效偏移少
T(n)=O(n-m+1+cm)=O(n+m)
ts+1 = (d(ts-T[s+1]h)+T[s+m+1])%q
t0 =23590%13=8
13
字符串匹配算法
朴素算法
Rabin-Karp算法
有限自动机算法
KMP算法
14
有限自动机
定义:
有限自动机M
5
原创力文档

文档评论(0)