【算法解析】
● 众所周知,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. 【云计算 Hadoop】Hadoop 版本 生态圈 MapReduce模型
  2. WebSocket+MSE——HTML5 直播技术解析
  3. adf检验代码 python_第22期:向量自回归(VAR)模型预测——Python实现
  4. asp.net 读取excel文件
  5. 认证(登录)功能需求分析
  6. 模拟导入系统通讯录5000+手机号 校验大量数据处理
  7. 【Java】GUI桌面弹球游戏
  8. T-SQL查询进阶--理解SQL Server中索引的概念,原理以及其他(看了两次了,转了)
  9. 安卓rtmp推流app_直播-腾讯云推流-sdk 播放地址不正确的解决方案---蜻蜓系统-uniapp-flutter通用...
  10. uniapp中使用moment.js日期插件
  11. SI4463配置软件wds3
  12. 5--残差网络(ResNet)
  13. python tolist()函数
  14. 吉林大学计算机 林向,基于不同尺度的山西太岳山森林主导生态功能评价研究...
  15. MVC母版页的使用方法
  16. elasticsearch 过期数据自动删除Java代码
  17. php后端switch,详解PHP中php switch的方法实例_后端开发
  18. 西瓜书学习(task2)
  19. 2020年数学建模国赛A题题目和解题思路
  20. Win10 SQL Server 2012 企业版 安装教程

热门文章

  1. smarty 模板 for循环 php,smarty模板中for循环的扩展插件
  2. 精彩回顾 | 拥抱鞋服全产业链数字化转型沙龙圆满落幕
  3. codevs1391 伊吹萃香
  4. 关于Linux系统中的local、localdef和字符集的那些事
  5. php removechild,PHP DOMNode removeChild()用法及代码示例
  6. wincc按钮控制的vb脚本_关于wincc professinal v15里使用vb脚本操作控件listview的问题-工业支持中心-西门子中国...
  7. 一、Vue环境搭建及基础用法
  8. Guixt 隐藏了之后怎么重新调出来
  9. 鹅妹子的skimage.measure.regionprops
  10. MIUI中无法获取所有短信的坑