对kmp算法的一个小小的总结
Posted 纯纯的心儿
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了对kmp算法的一个小小的总结相关的知识,希望对你有一定的参考价值。
今天重新回顾了 一下之前了解的那个kmp算法。这个算法来自数据结构的字符串的模式匹配;
字符串的模式匹配的最先是 得到一个效率低的传统匹配算法。
int i=0;int j=0;
int l1,int l2;//定义目标的字符串和我们现在的字符串
if(l1<l2) cout<<"匹配无效"<<endl;
while(i<l1&&j<l2)
if(t[i]==p[j])
i++;j++;
else
j=i-j+1;
i=0;
if(j>=l2)
return i-j+1;
这个是最先的一个方法进行字符串的匹配,但是效率低下;
所以又有了 优化
通过字符串的模式匹配的思想,得到一个特征向量。 得到一个next数组。这个求数组的方法不在此介绍
,具体可以参考张铭的数据结构。
接下来详细的分析下kmp 的代码;
首先得到一个优化的next数组
void tonext() //这个数组的内容只与本身的字符串有关,与目标串无关。
int j=-1,i=0; //i代表当前字符串的对应的匹配到的位置,j代表了后来的匹配的串
next[0]=-1; //将next数组next【0】=-1;
while(i<m)
if(j==-1||xiao[i]==xiao[j]) //当匹配相等或者j 匹配串为第一个的时候
i++;j++; //继续匹配
if(xiao[i]==xiao[j]) //若还是相等 ,那么就再次优化next数组,
next[i]=next[j];
else next[i]=j; //不需要优化,数组的值为 匹配所在的位置
else j=next[j]; //如果匹配失败,则给j一个next的值,作为偏移量
接下来就是 kmp 的具体操作 部分了
int kmp()
int i=0,j=0;
while(i<m&&j<n) //n m分别代码目标串的长度和 匹配串的长度
if(i==-1||xiao[i]==mo[j]) //当为第一个匹配的时候 或者两个串相等的时候
i++;
j++;
else i=next[i]; //否则的话 通过next数组来选择跳过i个值
if(i>=m) //判断是否匹配完成
return j-m+1;
else return -1;
小小的总结 留待更多的补充、
以上是关于对kmp算法的一个小小的总结的主要内容,如果未能解决你的问题,请参考以下文章