Kmp算法; 建立在有限自动机理解基础上; 思想相当简单了;
2010-06-22 13:55
375 查看
#include <stdio.h> #include <string.h> /*********************************/ * KMP算法 * 预处理时间:O(m), 运行时间O(n) * 改进了状态机算法的预处理时间 * 依旧利用后缀最前前缀原理 * 理解有限自动机后理解此算法 /*********************************/ const int MAXN=10000; char T[MAXN],P[MAXN]; int next[MAXN]; int m,n; void computePrefixFunction() { m=strlen(P)-1; next[1]=0; int k=0; // k比q延迟了2个身位 int q; for(q=2;q<=m;++q) { while(k>0&&P[k+1]!=P[q]) { k=next[k]; } if(P[k+1]==P[q]) { k=k+1; } next[q]=k; } } void kmpMatcher() { n=strlen(T)-1; m=strlen(P)-1; computePrefixFunction(); int q=0; //q比i延迟了一个身位 int i; for(i=1;i<=n;++i) { while(q>0&&P[q+1]!=T[i]) { q=next[q]; } if(P[q+1]==T[i]) //同时解决了q=0或者P[q+1]==T[i]两个问题 { q=q+1; } if(q==m) { printf("匹配成功,位置:%d/n",i-m+1); q=next[q]; } } } int main() { T[0]=P[0]='z'; scanf("%s%s",T+1,P+1); kmpMatcher(); return 0; }
算法的思想是这样的, 如果当前已经匹配了一段, 结果匹配下一个字符的时候失败了, 那么应该将模式串向右移动多少来继续匹配呢?
next数组就是这个作用,什么作用呢?
假设文本串T与模式串P。
P[1...k]与T[]的某一段匹配了, 结果P[k+1]与T[]的下一个字符不相等.
这时候,怎么办? 可以在P[]里找一个P[1...k]的最长前缀,而且这个前缀是P[1...k]的一个后缀, 那么这个后缀一定也与T[]的后半段匹配, 假设这个后缀是P[1...s], 那么现在可以继续判断P[s+1]与T[]下一个字符是否相等, 重复这个过程 .如果相等, 那么i++, s++.
就是这么一回事, 基础一定是有限自动机.
相关文章推荐
- 基于有限自动机的KMP算法构造思想
- 超级简单的理解kmp算法中的next的计算
- (这已经是数据库基础需要掌握的范畴的)mysql的深度解析 以及b+tree的原理 (给的答案是索引表 但感觉是要考察对b+tree的理解 博主能力有限不敢瞎说)
- 理解JAVA程序逻辑及面向对象编程思想简单总结(2)
- 理解JAVA程序逻辑及面向对象编程思想简单总结(1)
- 理解JAVA程序逻辑及面向对象编程思想简单总结(17)
- Spring之IOC思想的理解和简单实现
- java基础强化——深入理解java注解(附简单ORM功能实现)
- 一个javafx初学者实现国际象棋简单方法(很粗暴)棋子实现不再提供 没有使用java编程思想用的很基础的c语言思想
- .NET开发基础:从简单的例子理解泛型 分享
- KMP算法next数组通俗理解,适合考研及基础学习者
- 建立和理解Java 并发的基础
- 理解神经网络,从简单的例子开始(2)使用python建立多层神经网络
- KMP算法的简单理解 【笔记】
- [OpenCV基础] CommandLineParser类的简单理解
- 简单理解AOP --- 基础知识之代理模式
- 【转载】数据结构基础 之 深入理解二叉堆建立的时空复杂
- 理解JAVA程序逻辑及面向对象编程思想简单总结(6)
- java基础入门-建立简单的ServerSocket
- 理解JAVA程序逻辑及面向对象编程思想简单总结(4)