对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算法的一个小小的总结的主要内容,如果未能解决你的问题,请参考以下文章

KMP算法学习&总结

数据结构--KMP算法总结

总结与归纳之字符串

字符串匹配KMP算法详解

深度优先算法--对DFS的一些小小的总结

关于的字符串的总结(群,子群,KMP算法,正则表达式):