KMP字符串模式匹配详解(五)

下面是模式值使用第二种表示方法的匹配函数( next[0]=0
int my_KMP(char *S, char *T, int pos) 
{ 
int i = pos, j = 0;//pos(S 的下标0≤pos<StrLength(S)) 
while ( S[i] != '\0' && T[j] != '\0' ) 
{ 
    if (S[i] == T[j] ) 
     { 
         ++i; 
             ++j; // 继续比较后继字符
     } 
   else             // a b a b c a a b c 
                    // 0 0 0 1 2 0 1 1 2 
   {              //-1 0 -1 0 2 -1 1 0 2 
      i++; 
     j = next[j];     /*当出现S[i] !=T[j]时,
              下一次的比较应该在S[i]和T[next[j]] 之间进行。要求next[0]=0。
在这两个简单示范函数间使用全局数组next[]传值。*/ 
   } 
}//while 
if ( T[j] == '\0' ) 
    return (i-j); // 匹配成功
else 
     return -1; 
} // my_KMP 
 
六.后话 --KMP 的历史
[ 这段话是抄的 ]
Cook 1970 年证明的一个理论得到,任何一个可以使用被称为下推自动机的计算机抽象模型来解决的问题,也可以使用一个实际的计算机(更精确的说,使用一个随机存取机)在与问题规模对应的时间内解决。特别地,这个理论暗示存在着一个算法可以在大约 m+n 的时间内解决模式匹配问题,这里 m n 分别是存储文本和模式串数组的最大索引。 Knuth Pratt 努力地重建了 Cook 的证明,由此创建了这个模式匹配算法。大概是同一时间, Morris 在考虑设计一个文本编辑器的实际问题的过程中创建了差不多是同样的算法。这里可以看到并不是所有的算法都是“灵光一现”中被发现的,而理论化的计算机科学确实在一些时候会应用到实际的应用中。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值