数据结构(关于串的KMP匹配算法及其改进)
来源:互联网 发布:使用excel制作数据库 编辑:程序博客网 时间:2024/04/30 16:15
串的朴素的模式匹配算法:
对主串的每一个字符作为子串的开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做T的长度的小循环,直到匹配成功或全部遍历完成为止。例:S=“goodgoogle”T=“google”。
int Index(String S,String T,int pos) //返回子串T在主串S中第pos个字符之后的位置。S[0] T[0]代表字符串的长度{int i=pos;//i用于主串S中当前位置下标,若pos!=1,则pos从当前位置开始匹配int j=1;//j用于子串T当前位置下标值while(i<=s[0]&&j<=T[0]){If(S[i]==T[j]){++i;++j;}else //指针后退重新开始匹配{i=i-j+2;//i退回到上次匹配的首位的下一位j=1;} } If(j>T[0])return i-T[0];else return 0;}此算法的时间复杂度为O((n-m+1)*m)
KMP模式匹配算法:
1、T串中各个位置的j值定义一个数组next,next的长度为T串的长度
Next数组值推导:
j=123456
T=abcdex
N[j]=011111
j=123456789
T=ababaaaba
N[j]=011234223
2.KMP模式匹配算法实现
void get_next(String T,int *next){ int i,j; i=1; j=0; next[1]=0; while(i<T[0]) { if(j==0||T[i]==T[j])//T[i]表示后缀的单个字符,T[j]表示前缀的单个字符 {++i; ++j; next[i]=j;}else j=next[j]; //若字符不相同,则j值回溯}} int index_KMP(String T,String S,int pos){int i=pos;//i用于主串S中当前位置下标,若pos!=1,则pos从当前位置开始匹配 int j=1;//j用于子串T当前位置下标值 int next[255];get_next(T,next);while(i<=s[0]&&j<=T[0]){ If(j==0||S[i]==T[j]){ ++i; ++j;}else //指针后退重新开始匹配{ j=next[j];//j退回到合适的位置,i不变}}if(j>T[0])return i-T[0];else return 0; }
时间复杂度为O(m+n)
对next函数进行改良,取代的数组为nextval
void get_nextval(String T,int *nextval){ int i,j; i=1; j=0; nextval[1]=0; while(i<T[0]) { if(j==0||T[i]==T[j])//T[i]表示后缀的单个字符,T[j]表示前缀的单个字符 { ++i; ++j; if(T[i]!=T[j]) nextval[i]=j; else nextval[i]=nextval[j];}else j=nextval[j]; //若字符不相同,则j值回溯}}
1 0
- 数据结构(关于串的KMP匹配算法及其改进)
- [数据结构]程杰模式串匹配、KMP算法及其改进(代码)
- 串的模式匹配改进--KMP算法
- KMP算法实现及其匹配改进
- Java数据结构-串及其应用-KMP模式匹配算法
- 串模式匹配的改进算法——KMP算法
- 【数据结构】 串的模式匹配算法KMP
- KMP及其改进算法
- KMP及其改进算法
- 串匹配(KMP改进)
- C++ 改进的KMP模式匹配算法
- KMP(改进模式匹配算法)--串
- 数据结构串的实现以及KMP改进算法
- 数据结构——串(朴素的模式匹配算法、KMP模式匹配算法)
- 数据结构- 串的模式匹配算法:BF和 KMP算法
- 数据结构- 串的模式匹配算法:BF和 KMP算法
- KMP算法详解, 关于NEXT数组及其改进
- 【原创】朴素的模式匹配和改进的模式匹配(KMP)算法说明(草稿)
- 操作系统学习笔记:xv6 Barriers
- 7 纹理
- 为什么在vs 中用include<iostream.h>不行,而include<stdio.h>可用
- 苏嵌26 16.12.03
- 51nod-1262 扔球(欧拉函数)
- 数据结构(关于串的KMP匹配算法及其改进)
- 关于Xutils框架出现无法访问HttpRequestBase 找不到org.apache.http.client.methods.HttpRequestBase解决方案
- ansible 切换用户建立ssh连接并使用sudo 权限执行程序
- poj_1260 Pearls(dp)
- 哈尔滨理工大学软件学院ACM程序设计全国邀请赛(网络同步赛)L Lucky Number By Assassin 杀人的模拟题
- 16哈理工新生赛 A 棋盘村 (dp)
- 安装mysql提示This application requires .NET framework 4.0.
- HDU 3376 Matrix Again (最小费用最大流)
- js动态生成的标签,点击传递参数到js函数