【算法解析】
● 众所周知,KMP算法中模式串T的next数组,是KMP算法的核心。
next数组的核心作用是“当模式串T的第j位与主串S的第pos位失配时(即 T[j]≠S[pos] 时),让模式串T的第next[j]位与主串S的第pos位再进行比较”。这相当于让模式串T往右移动了 j-next[j] 位后,再进行比较。

● 正是由于next数组的引入,使得KMP算法的效率大大优于BF算法。但是,next数组在某些情况下仍存在缺陷。
例如,针对模式串"aaaab",其相应的next数组值为“-1 0 1 2 3”。则据next数组的作用易知,当 T[3]=a 与主串 S[pos] 失配时,则会使用 T[next[3]]=T[2]=a 与主串 S[pos] 再进行匹配,显然还会失配。这是因为,T[0]~T[2]与T[3]都相等,当T[3]与S[pos]失配时,T[0]~T[2]与S[pos]必然也失配。显然T[0]~T[2]与S[pos]的比较没有意义,一定会匹配失败。针对本模式串"aaaab"而言,将会有 T[3]=a≠S[pos],T[next[3]]=T[2]=a≠S[pos],T[next[2]]=T[1]=a≠S[pos],T[next[1]]=T[0]=a≠S[pos] 等四次比较。

● nextval数组的引入,正是为了减少这种无意义的比对,而对next数组进行的优化。

【手动求nextval数组的步骤】
● 手动求nextval数组(模式串下标从1开始)
若在KMP算法设计中,将模式串下标从1开始计数,那么求nextval数组的算法步骤为:
(1)求出next数组的值(定义next[1]=0,next[2]=1);
(2)定义nextval[1]=0。然后,比较模式串的第j个(j>1)字符是否与第next[j]个字符相等。若相等,则模式串第j个字符的nextval值等于第next[j]个字符的nextval值。若不等,则模式串第j个字符的nextval值等于其next数组值。
即,若T[j]=T[next[j]],则nextval[j]=nextval[next[j]]。否则,nextval[j]=next[j]。

● 手动求nextval数组(模式串下标从0开始)
若在KMP算法设计中,将模式串下标从0开始计数,那么求nextval数组的算法步骤为:
(1)求出next数组的值(定义next[0]=-1,next[1]=0);
(2)定义nextval[0]=-1。然后,比较模式串的第j个(j>0)字符是否与第next[j]个字符相等。若相等,则模式串第j个字符的nextval值等于第next[j]个字符的nextval值。若不等,则模式串第j个字符的nextval值等于其next数组值。
即,若T[j]=T[next[j]],则nextval[j]=nextval[next[j]]。否则,nextval[j]=next[j]。

【求nextval数组的算法代码】

#include<iostream>
using namespace std;const int maxn=100;
int ne[maxn],nev[maxn];void getNext(string s) {int len=s.length();int i=0,j=-1;ne[0]=-1;while(i<len) {if(j==-1||s[i]==s[j]) {i++;j++;ne[i]=j;} else j=ne[j];}
}void getNextval(string s) {int len=s.length();int i=0,j=-1;nev[0]=-1;while(i<len) {if(j==-1||s[i]==s[j]) {i++;j++;nev[i]=j;if(s[i]!=s[j]) nev[i]=j;else nev[i]=nev[j];} else j=nev[j];}
}int main() {string T;getline(cin,T);getNext(T);for(int i=0; i<T.length(); i++) {cout<<ne[i]<<" ";}cout<<endl;getNextval(T);for(int i=0; i<T.length(); i++) {cout<<nev[i]<<" ";}return 0;
}/*
input:
abcaabbabcaboutput:
-1 0 0 0 1 1 2 0 1 2 3 4
-1 0 0 -1 1 0 2 -1 0 0 -1 4
*/

【编程技巧】
● 由于字符串的下标从0开始,因此采用李春葆《数据结构》中的方式定义nextval[0]=-1,nextval[1]=0是很自然的事情。之后,利用语句 cout<<nextval[i]<<" "; 便可输出以“-1 0 ”开头的nextval数组值。
● 若想输出以“0 1”开头的nextval数组值,只需修改语句cout<<nextval[i]<<" "; 为cout<<nextval[i]+1<<" "; 便可。上页PPT中的其他代码保持不变。

【参考文献】
https://blog.csdn.net/qq_43456605/article/details/119954614
https://blog.csdn.net/qq_35963993/article/details/106236665

KMP算法 → 计算nextval数组相关推荐

  1. KMP算法 → 计算next数组

    [KMP算法简介] KMP算法中的next数组仅取决于模式串本身,而与相匹配的主串无关. KMP算法中的next数组,是KMP算法的核心. KMP算法是由克努特(Knuth).莫里斯(Morris)和 ...

  2. KMP算法计算next数组和nextval数组(通俗易懂)

    KMP算法(举例说明) 例:给出一个字符串序列:ababaaababaa.利用KMP算法分别求出next数组和nextval数组 分析: 数组索引:0-n 逻辑索引:1-n next数组: 1.nex ...

  3. 串的模式匹配、KMP算法、nextval数组求法

    一.暴力匹配 #include <iostream> using namespace std; #define MAXLEN 255 typedef struct{char ch[MAXL ...

  4. 模式匹配算法----KMP算法以及next数组的解法

    KMP算法:求字符串匹配(也叫模式匹配)的算法,即给定一个字符串,求其某一子串在其中出现的位置. 普通模式匹配 例如:给定字符串为abcabaaabaabcac,求其子串abaabcac在其中出现的位 ...

  5. KMP算法之next数组详解

    KMP算法之next数组详解 KMP算法实现原理 KMP算法是一种非常高效的字符串匹配算法,下面我们来讲解一下KMP算如何高效的实现字符串匹配.我们假设如下主串和模式串: int i;//i表示主串的 ...

  6. KMP算法的next数组通俗解释

    我们在一个母字符串中查找一个子字符串有很多方法.KMP是一种最常见的改进算法,它可以在匹配过程中失配的情况下,有效地多往后面跳几个字符,加快匹配速度. 当然我们可以看到这个算法针对的是子串有对称属性, ...

  7. KMP算法之NEXT数组代码原理分析 - 数据结构和算法38

    KMP算法之NEXT数组代码原理分析 让编程改变世界 Change the world by program KMP算法之NEXT数组代码原理分析 NEXT数组:当模式匹配串T失配的时候,NEXT数组 ...

  8. 数据结构与算法之KMP算法中Next数组代码原理分析

    2019独角兽企业重金招聘Python工程师标准>>> 一.KMP算法之Next数组代码原理分析       1.Next数组定义 当模式匹配串T失配的时候,Next数组对应的元素指 ...

  9. KMP算法及next数组(最大公共前后缀)求解

    KMP算法及next数组(最大公共前后缀)求解 2020.12.14理解: 1. KMP算法 网上关于KMP算法讲解较为简单易懂,因此在此只作简述: 在字符串s中匹配字符串t: S: ABE-AB-A ...

最新文章

  1. 微软、商汤等专家纵论AI未来:三年内主要趋势及挑战是什么?
  2. mysql awr v1.0.1发布
  3. vue 打包后页面空白问题
  4. java面试中jvm执行子系统详细分析(三)
  5. 16位的数字高字节和低字节_掩盖8位数字的较低和较高半字节| 8085微处理器
  6. python中的函数(function)也是对象(二分钟读懂)
  7. 如何在Java中分割字符串
  8. html表格内容自动更新,ElementUI table 组件展开 expand,动态更新数据时,视图没有自动更新...
  9. html5播放flv
  10. xodo pdf android,Xodo PDF查看器和编辑器「Xodo PDF Viewer Editor」
  11. Adams入门详解与实例(第2版)pdf电子书
  12. GBase 8a开启防火墙安装集群添加端口策略
  13. 【Deepin】 Deepin 系统安装教程
  14. 不入世的天才: 尼古拉·特斯拉
  15. 桌面图标有蓝底怎么去掉方法
  16. 使用Google快讯跟踪你的博客
  17. Day 4.Social Data Sentiment Analysis: Detection of Adolescent Depression Signals
  18. Python+Appium+unittest demo
  19. 正交设计 python算法_Python实现正交实验法-高级篇
  20. 【ATF】庄卓然(南天):掌上精彩-连接过去与未来

热门文章

  1. 启动awstats出现错误
  2. 国内某知名软件更新的安全分析
  3. 系统改造升级步骤及注意事项(一)
  4. 编写高效JavaScript
  5. 下载Resharp后 代码出现绿色蓝色波浪线等警告
  6. VS2017安装时出现win 10SDK安装不了的问题,错误代码:1327
  7. 微博上一曲绝唱,长这么大没听过这么感动的歌
  8. Vulkan学习--5.创建一个窗口表面和交换链
  9. 通用基于角色权限管理系统-李杰-专题视频课程
  10. 企业数字化转型全是坑?这几篇数字化转型成功案例,减少70%损失