数据结构——关于KMP算法的效率分析

通常的KMP算法可以描述如下,不知道的可以查相关资料。

 

从S的pos位置开始寻找字串T

 

int Index_KMP(String S,String T,int pos)
{
  i=pos;j=1;//这里的串的第1个元素下标是1
  while(i<=S.Length && j<=T.Length)
  {
    if(j==0 || S[i]==T[j]){i++;j++;} 
    else j=next[j];//i不变(不回溯),j跳动
  }
  if(j>T.Length) return i-T.Length;//匹配成功
  else return 0;
}

 

假设n=S.Length m=T.Length (m<=n)

许多数据结构的书上说该算法效率为O(m),却没有说明白。

 

查了些资料,其效率分析还是蛮有技巧的。其实主要在于while循环,每次if比较成功后,i++,j++,由于i一直递增,所以显然,由于s的length为n,该成功匹配执行的最大次数为n,所以j最多递增了n次,而由于if比较失败后 j=next[j],这里j至少是要减1的,所以,因为j最多增了n次,所以j=next[j]也最多执行了n次,所以这个while循环中的if其实最多执行了2n次,

 

所以这个while循环的时间复杂度为O(n)。

 

有时候,在我们对于不定次数的循环的时间复杂度分析比较困难的时候,可以采取依靠某个变量来决定算法的复杂度。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值