KMP匹配算法中的失效函数

今天总算是看懂了字符串匹配算法中的KMP,记下来吧,以后查的时候方便
失效函数:设模式 P=p 0p 1....p m-2p m-1, 则它的失效函数定义如下:
f(j)=k |当 0<=k<j 时,且使得 p0p1....pk=p j-kp j-k+1...p j 的最大数
f(j)= -1 | 其它情况。
j01234567
pabaabcac
f(j)-1-1001-10-1
详细的不记了,把算法记下来。
ExpandedBlockStart.gif ContractedBlock.gif void  String::fail dot.gif {
InBlock.gif    
int lengthP=curLen;
InBlock.gif    f[
0]=-1;
ExpandedSubBlockStart.gifContractedSubBlock.gif    
for(int j=1;j<lengthP;j++)dot.gif{
InBlock.gif        
int i=f[j-1];
InBlock.gif        
while(*(ch+j)!=*(ch+i+1)&&i>=0) i=f[i] ;  //递推计算
InBlock.gif
        if(*(ch+j)==*(ch+i+1))f[j]=i+1;  
InBlock.gif        elsef[j]
=-1;
ExpandedSubBlockEnd.gif    }

ExpandedBlockEnd.gif}
下面是普通的匹配算法:
ExpandedBlockStart.gif ContractedBlock.gif int  String::find(String  & pat)  const dot.gif {
InBlock.gif    
char*p=pat.ch; *s=ch; int i=0;
InBlock.gif    
if(*&& *s)
InBlock.gif        
while(i<=curLen-pat.curLen)
ExpandedSubBlockStart.gifContractedSubBlock.gif            
if(*p++==*s++)dot.gif{   // C++的精典之处
InBlock.gif
                if(!*p) return i;
ExpandedSubBlockEnd.gif            }

ExpandedSubBlockStart.gifContractedSubBlock.gif            
else dot.gif{ i++; s=ch+i; p=pat.ch; }
InBlock.gif    
return -1;
ExpandedBlockEnd.gif}
下面是 KMP 算法:
ExpandedBlockStart.gif ContractedBlock.gif int  String::fastFind(String  & pat)  const   dot.gif {
InBlock.gif    
int posP=0 , pasT=0 ;
InBlock.gif    
int lengthP=pat.curLen, lengthT=curLen;
InBlock.gif    
while(posP<lengthP && posT< lengthT)
ExpandedSubBlockStart.gifContractedSubBlock.gif        
if(pat.ch[pasP]==ch[posT]dot.gif{
InBlock.gif            posP
++; posT++ ;
ExpandedSubBlockEnd.gif        }

InBlock.gif        
else if (posP==0) posT++ ;
InBlock.gif        
else posP=pat.f[posP-1+ 1 ;
InBlock.gif    
if(posP<lengthP) return -1 ;
InBlock.gif    
else return posT-lengthP;
ExpandedBlockEnd.gif}

转载于:https://www.cnblogs.com/icehong/archive/2004/09/25/46613.html

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值