编辑by Touzani
http://blog.csdn.net/touzani/archive/2007/05/29/1628885.aspx
字符串匹配(String matching)
|
算法
|
预处理时间
|
匹配时间
|
|
|
||
|
朴素算法
|
0
|
O
((n - m + 1)m)
|
|
Rabin-Karp
|
Θ(m)
|
O
((n - m + 1)m)
|
|
有限自动机算法
|
O
(m |Σ|)
|
Θ(n)
|
|
KMP
算法
|
Θ(m)
|
Θ(n)
|
如果某个字符串 y ∈ Σ*,使得x=wy 。则称w是x的前缀, 记为w � x 。 如果w是x的后缀,记为w � x
可以把字符串匹配问题描述为 找出0 ≤ s ≤ n-m 并满足P � Ts+m的所有位移s
4 do if P[1 ‥ m] = T[s + 1 ‥ s + m] // 隐含着一个循环
5 then print "Pattern occurs with shift" s
因此,字符串"31415" 对应于十进制数31415
已知模式P[1..m],设p表示其相应十进制数地值,类似地, 对于给定的文本T[1..n]. 用
可以用霍纳规则(Horner’s rule) 在Θ(m) 的时间内计算p的值
p = P[m] + 10 (P[m - 1] + 10(P[m - 2] + · · · + 10(P[2] + 10P[1]) )).

如果能在总共Θ(n - m + 1) 时间内计算出所有的ts 的值,那么通过把p值与每个ts(有n-m+1个)进行比较,就能够在Θ(m) + Θ(n - m + 1)= Θ(n) 时间内求出所有有效位移。(计算出1个ts

本文介绍了字符串匹配的两种算法:朴素算法和Rabin-Karp算法。通过将字符串转换为数字并使用霍纳规则进行计算,可以在限定时间内完成匹配。Rabin-Karp算法在预处理和匹配时间上有优势,尤其当有效位移较少时,期望匹配时间接近线性。文章还讨论了如何处理数值溢出问题,选择合适的模q以适应计算机字长。
最低0.47元/天 解锁文章
623

被折叠的 条评论
为什么被折叠?



