对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;
}

 小小的总结  留待更多的补充、








  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值