字符串搜索之KMP算法(伪代码)
2016-07-21 20:38
211 查看
之前的Rabin-Karp算法虽然在一定程度上达到了优化,但是最坏情况下也是O(nm)的复杂度。
接下来说说KMP算法,复杂度是线性的O(n+m)
前缀表
• 我们可以预先计算大小为m的前缀表来存储p[q]的
值 (0 <=q < m)
P p a p p a r
q 0 1 2 3 4 5 6
p[q] 0 0 0 1 1 2 0
Knuth-Morris-Pratt 算法
KMP-Search(T,P)
01 pi <- Compute-Prefix-Table(P) //预处理前缀表P
02 q <- 0 // number of characters matched
03 for i <- 0 to n-1 // scan the text from left to right
04 while q > 0 and P[q] <> T[i] do
05 q <- p[q]
06 if P[q] = T[i] then q <- q + 1
07 if q = m then return i – m + 1
08 return –1
Compute-Prefix-Table 是P 上执行KMP 算法的本质.
KMP 的分析
• 最坏运行时间: O(n+m)
– 主算法: O(n)
– Compute-Prefix-Table: O(m)
• 空间: O(m)
接下来说说KMP算法,复杂度是线性的O(n+m)
前缀表
• 我们可以预先计算大小为m的前缀表来存储p[q]的
值 (0 <=q < m)
P p a p p a r
q 0 1 2 3 4 5 6
p[q] 0 0 0 1 1 2 0
Knuth-Morris-Pratt 算法
KMP-Search(T,P)
01 pi <- Compute-Prefix-Table(P) //预处理前缀表P
02 q <- 0 // number of characters matched
03 for i <- 0 to n-1 // scan the text from left to right
04 while q > 0 and P[q] <> T[i] do
05 q <- p[q]
06 if P[q] = T[i] then q <- q + 1
07 if q = m then return i – m + 1
08 return –1
Compute-Prefix-Table 是P 上执行KMP 算法的本质.
KMP 的分析
• 最坏运行时间: O(n+m)
– 主算法: O(n)
– Compute-Prefix-Table: O(m)
• 空间: O(m)
相关文章推荐
- 偿还技术债 - 通过重构拯救老代码
- 顺序表java实现
- 代码审阅软件Understand
- SpringMVC + mybatis结合
- Java实现满天星
- Java之详解坦克大战游戏(六)
- Spring主要核心
- 百度工程师讲PHP函数的实现原理及性能分析(三)
- 百度工程师讲PHP函数的实现原理及性能分析(二)
- JAVA CAS原理深度分析
- java 从String中匹配数字,并提取数字
- 百度工程师讲PHP函数的实现原理及性能分析(一)
- java设计模式之适配器模式
- PHP 引入并读取php数据文件,改html后缀为php完成html的一次编写ul,li遍历出现多次li
- 嵌入式系统上C++调用C语言接口代码链接时找不到C函数问题处理
- 从入门到精通:让人又爱又恨的注解(一)
- php 里邮箱找回密码 的正确格式
- 两个大的整数的运算(java)
- 告诉你一个java对象占用的内存大小的方法
- spring配置文件中classpath路径解析