关于KMP算法的

KMP算法,初学的时候感觉很好理解。但是真正要把实现的代码搞通了,花费了好大的精力。

这是最终的实现代码:

 #include <iostream.h>
#include <string.h>
int next[128];
void Get_Next(char *p)
{
 for ( int w=0; w<128; w++)
  next[w] = 0xefffffff;
 int i = 1, j = -1;
 next[0] = -1;
 int plen = strlen(p);
 while (i < plen)
 {
  if ( j==-1 || p[i] == p[j] ) { i++; j++; next[i] = j;}
  else j = next[j];
 }
}
int Index_KMP(char *s, char *p, int pos)
{
 int i, j;
 int slen = strlen(s);
 int plen = strlen(p);
 i = pos;
 j = -1;
 while ( i<slen && j<plen )
 {
  if ( j==-1 || s[i] == p[j] )
  {
   i++;
   j++;
  }
  else
  {
   j = next[j];
  }
 }
 if ( j>=plen ) return i-plen;
 else return -1;
}
int main(void)
{
 char strS[] = "aabcab";
 char strP[] = "c";
 Get_Next(strP);
 int nPos = Index_KMP(strS, strP, 0);
 cout<<"The position is:/t"<<nPos<<endl;
 return 0;
}





理解这个算法的实现花费了好几天的业余时间。 殷版数据结构书上因为要用面向对象,所以算
法无关代码有一些,初学时候有些妨碍。计算机水平与资格考试的《软件设计师教程》上的算法
好像有错误,就是我在代码中标识的,如果那个j的初始值为0,那么对于单个字符的字符串就会
有错误。



从网上搜索的信息看,好多人都是不能理解next[]的构造,这个也的确是这个算法的难点和关键点

其实殷版数据结构上关于这个讲的挺多的,大家如果能把这个解释认真地看上10遍(我感觉自己就
前后看了10遍多,不是一个时间看的,我比较笨,只能这么学了),再自己把那些结果数据推2遍
(我自己在纸上写了一遍,其实每次看的时候都在脑子里推的),应该是能理解的。

我感觉关键点就是其思想是一个类似归纳法的方法。假设next[j] = k ,这个在 j==0 的时候就是
成立的(此时 k=-1 ),然后由此推出 next[j+1] 等。

要全部写出来挺费事的。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值