本文是根据考研数据结构2019版天勤高分笔记理解编写的:

首先给出代码:

1 void getnext(Str substr,int next[]){

 2     int i=0,j=0;
3 next[1]<=0;
4 while(i<substr.length){
5 if(j==0 || substr.ch[i]==substr.ch[j]){ //俩种情况会导致j==0。a,给串第一个元素的next[1]赋值时j默认为0 b,当模式串和主串不匹配时,j回溯到next[1]=0
//当前元素和已经匹配的串(正在延伸的前缀)的下一个元素进行比较,相等就继续延伸,否则j进行回溯,第10行(需要明白next的作用)
6 ++i;++j;
7 next[i]=j; //j表示0-j-1的前缀和后面一部分的子串已经匹配成功
8 }
9 else{
10 j=next[j]; //j回溯
11 }
12 }
13 }

数组pre和数组p一致,即next[j]代表已匹配前缀串pre的下标       如:j=5就代表已匹配的前缀ADAB的下标1,2,3,4

当j=5时,ch[11]!=ch[5],此时,退而其次,在已匹配的串"ADAB"中寻找能匹配D的元素。

而next数组的作用就是当模式串中第j个字符发生不匹配时,应从next[j]处的字符开始重新与主串比较。所以j回溯的时候用的是j=next[j];

只是:为什么next能起这样的作用呢?给个串对照一下:

这里我只把上面那部分的串的4位置和10位置的B改成了A,next数组只有next[5]由1变成了2.

现在讲讲我自己的理解:1,回退的过程中不仅2位置要和11位置想对应,2位置之前的所有位置(虽然这里只有一个元素)都必须和11位置前的响应元素一一对应,而next数组就代表前面有多个字符和前缀匹配成功。

2,正如前面所说的,数组pre和数组p一致,即next[j]代表已匹配前缀串pre的下标 ,,为什么改next【5】是2,对应了2(下标)位置的D,因为4位置的A和前缀A匹配。

=》保证俩个元素比较前,前缀和 j 位置前的对应长度的串是相等的(也就 是next的作用)

c和D不匹配ADAA这个前缀串的前缀是A,回溯到j=2,此时是保证了2(因为举例较简单,所以前缀只有一个元素,但我们可以把2位置发散成n位置)位置前所有的前缀(2-1  即n-1)个元素是和C元素前(2-1  即n-1)个元素匹配成功的;

而"ADAAC"和"ADAAD"中的"ADAA"的元素是匹配成功的,所以保证了ch【2-1】=ch【5-1】=ch【11-1】同样,这里的ch虽然只是一个字符,但也可以发散成一个串。

3,如果没有符合要求的子串,j必定回溯到1.

小编也是花了一整天根据自己对书本的理解,如果大家有什么不明白还请耐心点,kmp需要时间来理解!

对KMP算法通过代码生成next数组理解的更多相关文章

  1. KMP 算法中的 next 数组

    KMP 算法中对 next 数组的理解 next 数组的意义 此处 next[j] = k:则有 k 前面的浅蓝色区域和 j 前面的浅蓝色区域相同: next[j] 表示当位置 j 的字符串与主串不匹 ...

  2. 字符串模式匹配之KMP算法图解与 next 数组原理和实现方案

    之前说到,朴素的匹配,每趟比较,都要回溯主串的指针,费事.则 KMP 就是对朴素匹配的一种改进.正好复习一下. KMP 算法其改进思想在于: 每当一趟匹配过程中出现字符比较不相等时,不需要回溯主串的 ...

  3. KMP算法中next函数的理解

    首先要感谢http://blog.csdn.net/v_july_v/article/details/7041827以及http://blog.chinaunix.net/uid-27164517-i ...

  4. (收藏)KMP算法的前缀next数组最通俗的解释

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

  5. KMP算法中求next数组的实质

    在串匹配模式中,KMP算法较蛮力法是高效的算法,我觉得其中最重要的一点就是求next数组: 看了很多资料才弄明白求next数组是怎么求的,我发现我的忘性真的比记性大很多,每次看到KMP算法求next数 ...

  6. kmp算法中的next数组实例解释

    假设求串′ababaaababaa′的next数组 模式串 a b a b a a a b a b a a 下标 1 2 3 4 5 6 7 8 9 10 11 12 1.前两位:next数组前两位一 ...

  7. KMP算法中的next数组求解示意图

  8. 数据结构KMP算法中手算next数组

    总结一下今天的收获(以王道数据结构书上的为例子,虽然我没看它上面的...):其中竖着的一列值是模式串前缀和后缀最长公共前缀. 最后求得的结果符合书上的结果,如果是以-1开头的话就不需要再加1,如果是以 ...

  9. KMP算法中我对获取next数组的理解

    之前在学KMP算法时一直理解不了获取next数组的函数是如何实现的,现在大概知道怎么一回事了,记录一下我对获取next数组的理解. KMP算法实现的原理就不再赘述了,先上KMP代码: 1 void g ...

随机推荐

  1. 【287】◀▶ arcpy 常用类说明

    ArcPy 类列表(按字母顺序) 01   Raster 创建一个可在 Python 脚本或地图代数表达式中使用的栅格对象. 02   Cursor Cursor 是一种数据访问对象,可用于在表中迭代 ...

  2. xcode找回欢迎界面

    [xcode找回欢迎界面] 有一次嫌xcode界面烦,点击了以下checkbox取消了欢迎界面: 随后发现没了欢迎界面反而更不方便,一心想找回欢迎界面,Preference里找了半天没找到开关,原来开 ...

  3. java基础之多线程一:概述

    概述: 进程有多条执行路径, 合成为: 多线程. 进程和线程的描述: 进程: 可执行程序(文件), 例如: .exe//可以把进程理解为一辆车. 一台电脑上可以有多个进程, 这些进程之间的数据是相互隔 ...

  4. linux SIGSEGV 信号捕捉,保证发生段错误后程序不崩溃

    在Linux中编程的时候 有时候 try catch 可能满足不了我们的需求.因为碰到类似数组越界 ,非法内存访问之类的 ,这样的错误无法捕获.下面我们介绍一种使用捕获信号实现的异常 用来保证诸如段错 ...

  5. elasticsearch配置小记(转)

    原文  http://bigbo.github.io/pages/2015/04/10/elasticsearch_config/ 基于 elasticsearch 1.4.4 版本.安装方式为RPM ...

  6. 图的第k短路

    [问题描述] 给你一个有向图,求从1到n的第k短路. [解法] SPFA+A*搜索. 1 A*算法 A*算法在人工智能中是一种典型的启发式搜索算法,启发中的估价是用估价函数表示的: h(n)=f(n) ...

  7. ubuntu PCL的使用

    cmake_minimum_required(VERSION 2.8) project(MY_GRAND_PROJECT) find_package(PCL 1.3 REQUIRED COMPONEN ...

  8. c语言实践 打印三角形

    效果如下: 我是怎么考虑这个问题的. 首先共有5行,那么我们需要一个循环,让这个循环走5遍. 那么我们有个大概的代码结构 for(int i=0;i<5;i++) { } i的定义域是[0,4] ...

  9. Linux extundelete命令

    一.简介 extundelete的文件恢复工具,支持ext3/ext4双格式分区恢复. 二.安装 yum install -y e2fsprogs* e2fslibs* wget http://nch ...

  10. Openssl genpkey命令

    一.简介 genpkey命令用于产生各种密钥(RSA.DSA.DH.EC等)的私钥值. 二.语法 openssl genpkey [-out filename] [-outform PEM | DER ...