文章目录

  • 前言
  • 一、next数组
    • 1、next数组是什么
    • 2、求next数组
  • 二 、nextval数组
    • 1、nextval数组是什么?
    • 2、求nextval数组

前言

在我们学习数据结构字符串的时候会遇到匹配问题,当然我们可以用简单匹配算法,但是为了追求效率我们还有KMP算法 而实现KMP算法是离不开next数组的。
今天我就来讲解一下next数组和进阶next数组nextval;

看此篇文章需要了解一下KMP算法,KMP算法在我另一篇博客里,可以先了解一下再来看;


一、next数组

在讲解之前我们要了解两个概念;
前缀和后缀
看一串字符:a b a b b c
若我们现在正在与主串比较第四个字符
有前缀 :a ,ab ,aba(我们看真前缀-也就是不能等同于前面的字符串)所以aba我们就不看了
有后缀 :a ,ba ,aba (aba不在考虑的范围)
next数组就是取最大相同前后缀字符个数加一;
那么正在匹配的 b 所对应的next[4]=最大相同前后缀字符个数加一=1+1=2;

1、next数组是什么

next数组是为了解决匹配过程中子串回溯的问题,如果每次都像简单匹配算法一样回溯到第一个字符的位置那未免效率太低了,我们看下面一张图:

上面一行是字符数组的下标,为了更能清楚的显示,我是用一开头,前面的第一位可以用来表示字符的个数;
可以看到下面一行就是next数组,数组里面的数的意思是–
当到第三位a不匹配时我们回溯到next数组所指向的哪一位,也就是第一位;
当我们到第五个不匹配时将回溯到第三位,这就是next数组,避免每次都回溯到第一位

2、求next数组


#define MAX 100
typedef struct stu {char arr[MAX];int length;
}Str;void getnext(Str l, int* next)
{int i = 1,t=0;while (i < l.length){if (i == 0){next[i] =0 ;}if (t == 0 || l.arr[i] == l.arr[t]){next[i + 1] = t + 1;i++;t++;}else{t = next[t];}}
}
//这里我用字符串的第一位表示字符串的个数,这样更方便;

这就是求得next数组的完整代码,

二 、nextval数组

1、nextval数组是什么?

我们知道KMP算法中主串永远不回溯,所以我们需要保证在next数组所指向的回溯位置不能与之前位置上的字符相同,如下图

可以看到下面一串数字就是nextval数组

当到达第四个字符 a 时发生了不匹配,若运用next数组回到第一位,由于主串永远不回溯则在第一位上的 a 与主串当前位置上的字符也会不匹配,为了避免这种情况则有了nextval数组;

2、求nextval数组

#define MAX 100typedef struct stu {char arr[MAX];int length;
}Str;void getnextval(Str l, int* nextval,int* next)
{int i = 1, t = 0;nextval[1] = 0;while (i < l.length){if (t == 0 || l.arr[t] == l.arr[i]){next[i+1]= t + 1;if (l.arr[i + 1] != l.arr[next[i + 1]]){nextval[i + 1] = next[i+ 1];}else{nextval[i + 1] = next[next[i + 1]];}t++;i++;}else{t = next[t];}}
}

对比两个数组的求法会发现变化并不大;

总的来说,next数组是为了求得KMP算法,加大运行的效率;

next数组及进阶nextval数组相关推荐

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

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

  2. 【KMP】从原理上详解next数组和nextval数组

    本文将从原理上详细解释KMP算法中的next数组以及nextval数组,尽量让大家明白它们到底在记录什么,为什么要这样算.以及现在普遍的KMP算法实现当中的next数组与前两者有何不同.篇幅较长,但尽 ...

  3. nextval数组如何求解

    nextval数组示例 j 1 2 3 4 5 6 7 8 9 模式串T a b a b a a a b a next 0 1 1 2 3 4 2 2 3 nextval 0 1 0 1 0 4 2 ...

  4. 字符串匹配KMP算法中Next[]数组和Nextval[]数组求法

    数据结构课本上给了这么一段算法求nextval9[]数组 1 int get_nextval(SString T,int &nextval[ ]) 2 { 3 //求模式串T的next函数修正 ...

  5. C语言程序设计 | 指针的进阶(一):字符指针、数组指针、指针数组、函数指针

    指针的进阶(一)目录: 字符指针 数组指针和指针数组 函数指针 字符指针 在开始讲解这一章节之前,我们需要了解指针前面声明的类型的意义 类型 * 指针名 对于指针来说,我们在给指针进行声明时,我们声明 ...

  6. 数据结构:详解KMP算法,手工求解next、nextval数组,求模式串的比较次数例题

    KMP 算法 手工求解 next 数组,nextval数组 例题:求模式串的比较次数 2019 年 408 统考真题 设主串 T="abaabaabcabaabc",模式串 S=& ...

  7. Scala数组的基本操作,数组进阶操作,多维数组

    1.Scala中提供了一种数据结构-数组,其中存储相同类型的元素的固定大小的连续集合.数组用于存储数据的集合,但它往往是更加有用认为数组作为相同类型的变量的集合 2 声明数组变量: 要使用的程序的数组 ...

  8. KMP算法总结+Next数组+Nextval数组

    KMP算法是一种用于比较字符串匹配的算法,适用于在一个串中找另一个串是否存在,在这里如果不用字符串中的函数的话,一般能想到的第一种方法就是暴力,即从第一位开始比较. ①暴力方法 查找串:1 2 1 2 ...

  9. 4. 串的【朴素模式匹配算法】、【KPM算法:求next数组、nextval数组】

    串的模式匹配:在主串中,找到与模式串相同的子串,并返回其所在位置. 其实就是给出一个串abc,找到abc在主串的位置[abc都要匹配] 模式串:给出一个串abc 子串:主串中的abc[可能没有] 文章 ...

最新文章

  1. 为什么要设置java环境变量_为什么要配置JDK环境变量?
  2. 专访闪送联合创始人于红建:要继续深耕国内市场
  3. 《神探tcpdump第四招》-linux命令五分钟系列之三十八
  4. 八十二、Python | Leetcode贪心算法系列
  5. 去银行贷款,有中介和没中介的巨大差别
  6. angular中封装fancyBox(图片预览)
  7. 跨性别,你所不知道的事
  8. java中trim_java中string.trim()函数的作用实例及源码
  9. Repeater嵌套Repeater获取父级绑定项
  10. 趋势交易 高 更高_2020年为开发商带来什么,以及更多的行业趋势
  11. 1 | GNN基础理论
  12. composer QA
  13. matlab2c使用c++实现matlab函数系列教程-tanh函数
  14. ua获取手机型号_如何根据 UA 判断手机型号和厂家?
  15. DB9封装、TTL/CMOS/RS232电平基础
  16. 桌面计算机图标怎么调出来,我把桌面上的一个图标隐藏了如何显示出来
  17. 努比亚 Z17s (Nubia NX595J) 解锁BootLoader 并刷入recovery ROOT
  18. Model和ModelMap的关系
  19. Go语言和php个和lua,当Go遇上了Lua,会发生什么
  20. 在Ubuntu1604中安装ROS Kinetic

热门文章

  1. webview过滤广告终极招式
  2. IT架构治理规划指导方案(ppt)
  3. charm-crypto安装(一)
  4. Matlab中fopen函数用法
  5. Appium如何关闭APP?
  6. pytorch读取图片并按比例改变图片的大小或者是固定大小
  7. C#ToolStrip
  8. Ubantu系统下分卷压缩文件的解压
  9. 一元二次方程的求解,打印出复数的表示方法
  10. 为什么说AI创业不是4、5个人的团队就能搞定的事