数据结构(关于串的KMP匹配算法及其改进)
2016-12-04 14:01
786 查看
串的朴素的模式匹配算法:
对主串的每一个字符作为子串的开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做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值回溯
}
}
对主串的每一个字符作为子串的开头,与要匹配的字符串进行匹配。对主串做大循环,每个字符开头做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值回溯
}
}
相关文章推荐
- 数据结构之串的KMP模式匹配算法的实现
- 数据结构——串的朴素模式和KMP匹配算法
- 数据结构之串的模式匹配算法(KMP)
- 数据结构——串的朴素模式和KMP匹配算法
- 数据结构——串的朴素模式和KMP匹配算法
- Pku acm 2536 Gopher II 数据结构题目解题报告(十四)---- 匈牙利算法求二分图的最大匹配
- 【数据结构与算法基础】栈及其应用后缀、中缀表达式 / Stack and postfix/infix expression
- C++ 改进的KMP模式匹配算法
- Pku acm 2771 Guardian of Decency 数据结构题目解题报告(十五)---- 匈牙利算法求二分图的最大匹配
- 数据结构与算法学习笔记——堆栈及其应用(10以内简单四则计算器)
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- 【数据结构与算法】内部排序之二:冒泡排序和选择排序(改进优化,附完整源码)
- KMP(改进模式匹配算法)--串
- Pku acm 2239 Selecting Courses 数据结构题目解题报告(十二)---- 匈牙利算法求二分图的最大匹配
- 【数据结构与算法】模式匹配——从BF算法到KMP算法(附完整源码)
- 【数据结构与算法基础】单链表及其应用基数排序 / Singly Linked List and radix sort
- 数据结构之kmp模式匹配
- 考研数据结构与算法之堆栈的使用(三)利用堆栈匹配括号
- 【原创】朴素的模式匹配和改进的模式匹配(KMP)算法说明(草稿)
- 改进版KMP模式匹配算法