KMP算法(刘汝佳算法书学习)
来源:互联网 发布:淘宝运营职位 编辑:程序博客网 时间:2024/05/22 00:15
KMP理解:
假定在匹配中,正在比较的文本串位置和模板串abbaaba最后一个字符不符合(失配),这是朴素算法会将模板串右移一位,继续比较,但是kmp不这样做,kmp认为既然!!位置已经比较过,应该可以利用模板串本身属性判断出右移一位不能匹配,同理,右移两位或者三位也不行,但是右移四位是有可能的。这个时候,需要比较 ‘’‘’*处的字符和abbaaba的第三个字符。
下面那个链状图就是一个状态机,其中编号为i的节点表示已经匹配了i个字符,匹配开始是0,如果成功匹配则+1,失配时‘沿着失配边走’,如果在状态6处失配,应转到状态2.。为了方便,这里使用失配函数f[i]表示状态i失配时应转移到的新状态,要特别注意的是f[0]=0。
#include <cstdio>#include <cstring>#include <algorithm>#include <vector>#include <queue>#include <iostream>using namespace std;void getFail(char* p,int* f){ int m=strlen(p); f[0]=0,f[1]=0; for(int i=1;i<m;i++) { int j=f[i]; while(j&&p[i]!=p[j]) j=f[j]; f[i+1]=p[i]==p[j]?j+1:0; }}///打出状态转移表(next数组求)/(失配边)void get_next(char* T,char* P,int* f){ int n=strlen(T),m=strlen(P); getFail(P,f); int j=0; //printf("11111111"); for(int i=0;i<n;i++) { while(j&&P[j]!=T[i]) j=f[j]; if(P[j]==T[i]) j++; if(j==m) printf("子串位置: %d\n",i-m+1); }}//两串比较开始跳跃寻找子串位置int main(){ char str[13]={"ABRACADABRA"}; char str2[4]={"CAD"}; int f[20]={0}; getFail(str,f); printf("状态转移方程:\n"); for(int i=0;i<12;i++) { printf("%d",f[i]); } cout<<endl; get_next(str,str2,f); return 0;}
阅读全文
0 0
- KMP算法(刘汝佳算法书学习)
- KMP算法(学习记录)
- KMP 算法学习(转)
- kmp算法学习(未完成)
- KMP算法知识学习
- KMP算法学习
- KMP算法学习笔记
- KMP算法学习
- KMP算法学习
- KMP算法学习!
- KMP算法学习总结
- KMP算法学习
- KMP算法学习
- 初步学习KMP算法
- KMP算法学习
- KMP算法学习
- KMP算法学习
- KMP 算法学习
- 断点续传
- Spark-Scala-IntelliJ开发环境搭建和编译Jar包流程
- 1.Linux--进程间通信(二)
- 【代码片-7】 基于jsp+javabean+servlet+mongodb 增删改查
- 无意读到的好书:漏洞战争
- KMP算法(刘汝佳算法书学习)
- eclipse+jdbc+mysql+statement实现数据库的增删改
- PID的理解
- Hadoop小兵笔记【四】hadoop2.2.0伪分布式环境搭建问题-ssh登录失败
- 不相交集合(转)
- 新版Lua服务器下线处理
- 【代码片-3】 基于jsp+javabean+servlet+mongodb 增删改查
- commons pool2对象池入门
- SSM整合手机联系人