当前位置:首页 > 编程笔记 > 正文
已解决

数据结构(超详细讲解!!)第十八节 串(KMP算法)

来自网友在路上 166866提问 提问时间:2023-10-31 09:05:46阅读次数: 66

最佳答案 问答题库668位专家为你答疑解惑

1.BF算法

算法在字符比较不相等,需要回溯(即i=i-j+1):即退到s中的下一个字符开始进行继续匹配。

最好情况下的时间复杂度为O(m)。

最坏情况下的时间复杂度为O(n×m)。

平均的时间复杂度为O(n×m)。

2.KMP算法

KMP算法是D.E.Knuth、J.H.Morris和V.R.Pratt共同提出的,简称KMP算法。        

该算法较BF算法有较大改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。

设串s的长度为n,串t长度为m。        

在KMP算法中求next数组的时间复杂度为O(m),在后面的匹配中因主串s的下标不减即不回溯,比较次数可记为n,所以KMP算法平均时间复杂度为O(n+m)。        

最坏的时间复杂度为O(n × m)。

int KMPIndex(SqString s,SqString t) 
{     int next[MaxSize], i=0, j=0;GetNext(t,next);while (i<s.length && j<t.length) {  if (j==-1 || s.data[i]==t.data[j]) {    i++;j++;			//i、j各增1}else   j=next[j]; 		//i不变,j后退}if (j>=t.length)return(i-t.length);		//返回匹配模式串的首字符下标elsereturn(-1);		/

由模式串t求next值的算法:

void GetNext(SString t,int next[])	 
{     int j, k;j=0;  k=-1;  next[0]=-1;while (j<t.length-1){	if (k==-1 || t.data[j]==t.data[k]){      j++; k++;next[j]=k;}else  k=next[k];}
}

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"数据结构(超详细讲解!!)第十八节 串(KMP算法)":http://eshow365.cn/6-28490-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!