数据结构笔记学习

数据结构的学习-KMP算法
在这里插入图片描述
KMP算法是对BF算法的进一步改进,当匹配字符不相等时不需要回溯i指针 只需要滑动子串移动j的位置,匹配时仅需从模式串中第K个字符与第i个字符开始依次向后比较,那如何确定模式串j中开始匹配的第K个字符的位置呢

n e x t [ j ] = k next[j]=k next[j]=k,则 n e x t [ j ] next[j] next[j]表明当模式中第j个字符与字符中相应字符不匹配时,在模式中需要重新和主串中该字符进行比较的字符的位置。
S是主串 T是模式串
模式串的next函数的定义:

  1. n e x t [ j ] next[j] next[j]=0 j=1 (默认next[j]的第一位是0)
  2. n e x t [ j ] next[j] next[j]=MAX { ( k ∣ 1 < k < j k| 1<k<j k1<k<j 且判断 模式串的前缀和后缀相等的个数有多少(N), 则K-1=N,由此得K值,则 n e x t [ j ] = k next[j]=k next[j]=k}
  3. n e x t [ j ] next[j] next[j]=1 {K=1(当不存在相同子串时,进行下一步比较,这就属于其他情况K值等于1)}
    (小白刚上手写个导图的样式也不太容易啊,呜呜呜呜呜呜)

n e x t v a l [ j ] nextval[j] nextval[j]修正函数值求解

在这里插入图片描述

KMP算法
 int index_KMP(SString S,SString T,int pos)   ///S是主串 T是模式串
                   { //利用模式串T的next函数求T在主串S中第POS个字符之后的位置
                        //其中,T非空,1<=pos<=S.lengh
                        i=pos; j=1;   //初始化
                       while(i<=S.length && j<=T.length)  //两个串均未比较到串尾
                          { 
                              if(S.ch[i]==T.ch[j]) 
                                 {++i;++j;} //继续比较后继字符
                              else {
                                 j=next[j]; }       ///主串i不变,模式串j后退即模式串右移 
                              }      
                       if(j>T.length)  return i-T.length; ///匹配成功
                           else return 0;  //匹配失败 }

就这样吧,,,,,,,,,会计算NEXT和NEXTVAL的值就好了。。。。。中秋节快乐啊,记得吃月饼。

我累了需要躺一会【葛优躺.jpg】

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值