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

来源:互联网 发布:如何关闭qq游戏端口 编辑:程序博客网 时间:2024/04/30 14:55

通常的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)。

 

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