KMP 算法是 D.E.Knuth、J,H,Morris 和 V.R.Pratt 三位神人共同提出的,称之为 Knuth-Morria-Pratt 算法,简称 KMP 算法。该算法相对于 Brute-Force(暴力)算法有比较大的改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。

算法具体实现以及相关说明建议直接B站搜索-严蔚敏数据结构。讲解详细,通俗易懂。

获得Next[]数组对应值的函数:

需注意的是,Next数组的第一个元素用来存长度,第二个元素往后才用来存数据,这样是更方便理解,因为此时的数据是从1开始。

1. 当模式串Q第j个字符和主串S第i个字符不等时存在等式:

Q1.....Qj-1 = Si-j+1 .. Si-1;

2.假设存在k,将模式串进行移位,移到第k位后。主串不动。

主串与移位后的模式串得出的等式:

(1)Q1 ... Qk-1 = Si-k+1 ..Si-1;

主串和未移位的模式串得出的等式:

(2)Qj-k+1 .... Qj-1 =Si-k+1 ..Si-1;(该等式就相当于1等式的子等式)

(1)和(2)等式就可以得出:

Qj-k+1 ... Qj-1 = Q1....Qk-1;那么只需要Qj-k+1...Qj-1 = Q1....Qk-1等式成立即可。

那么相关Next数组的数值我们就可以看出来了

eg:

1 2 3 4 5 6 7 8

模式串: a b a a b c a c

Next[] :    0 1 1 2 2 3 1 2

但是当数据长度越长,越往后对其Next数组的数值的判断越复杂。

此时需要注意:当Next[i] = k,此时对Q[i]和Q[k]进行判断如果相等:Next[i+1]=k+1;

(Next[i] = k 说明 Qi-k+1 ... Qi-1 = Q1 .... Qk-1,那么当Qi=Qk所以就会存在

Qi-k+ ... Qi-1 Qi=Q1... Qk-1 Qk,那么Next[i+1] = k+1。)

如果不相等k=Next[k];

(当前模式串的Q[i] 不等于Q[k],我们将Qi的串看成主串,Qk的串看成模式串就很好理解了,.就拿上面举的例子来说 第4个字符的Next[4] = 2 ,且Q[4] 不等于Q[2]。我们将原有的模式串看成主串,将Q1 .. Q2 看成模式串T,因为T[2]和Q4不相等,那么我们就需要移位,移位多少就根据此时T[2]的Next[2]是多少。此时T[2]的Next[2]是1,那么就是Q[4]和T[1]继续判断,此时相等,那么k=2.如果不等,此时Next[1]=0,那么就从1重新开始比。)

总的来说就是如果Q[i]和Q[k]不相等,就将原有的看成主串,k长度的串看成字串,因为此时出现了不匹配的状况,所以需要移位,拿当前不匹配的当前位的Next值又是多少,就将k长度看成主串,其Next[k]长度看成字串,直达出现相等的时候或者Next = 0的时候。

此处用的就是递归的思想。

具体的例子可以去看严蔚敏老师的数据结构,里面有很详细的例子。

KMP算法改进:

1 2 3 4 5

当主串 a a a b a

模式串 a a a a c

此时模式串的Next值 分别是:

模式串:a a a a c

Next[]  :  0 1 2 3 4

当S[4] != T[4]时,i指针不动,j指针移到第3个字符。在进行S[4]与T[3]的比较,又不等,i指针不动,j指针移到第二个字符。此时可以看出多出来许多不必要的比较。

对Next数组的值求解进行改进:

新增的判断其主要部分在于如果T[j] =T[k]了就将nextval[j] =  nextval[k];因为T[j] = T[k],

当S[i] != T[j]时,j指针移到到nextval[j]位,但此时T[j] 与T[nextval[j]]是相等的,

那么S[i]与T[nextval[j]]必然是不相等的,那么还需要在进行一次移位。所以就进行了不必要的重复。新增的判断让其在相等的时候,就回溯到nextval[k]的位置,避免了重复的步骤。

因为我们这是从第一位字符开始的,那么回溯一次即可。

KMP算法-严蔚敏数据结构相关推荐

  1. 严蔚敏数据结构源码及习题解析

    ⭐ 我的网站: www.mengyingjie.com ⭐ 严蔚敏数据结构源码及习题解析 习题解析未更新完整,以后更新 内容已上传到github,欢迎star和fork: https://github ...

  2. 严蔚敏数据结构C语言版——线性表的链式存储方式详细代码

    一.严蔚敏数据结构C语言版 由于书上的许多地方都是伪代码,所以下面的代码对课本上的做了一些改动,使代码能够正常运行 链表的定义即相关类型定义 typedef int ElementType; type ...

  3. KMP算法(严蔚敏数据结构第二版)

    KMP算法之前看过一次,看了好久才看明白,今天又学的时候发现啥也不会了,又看了好久,在这里整理一下思路,方便以后复习. 算法介绍 在我们常规的模式匹配算法中,每当匹配失败时,模式串都从第一个字符开始重 ...

  4. 严蔚敏数据结构c++版微盘_数据结构复习知识点总结

    <数据结构>重点在线性表.树.图.查找和排序.参考书目是<数据结构>(C语言版)严蔚敏.吴伟民编著.通过对线性表.队列.栈和数组的了解,进一步理解其含义,熟悉各种例如进栈.出栈 ...

  5. 2021-10-16【严蔚敏数据结构代码实现合集】【c语言学习必备】

    本文记录了我为期三个月<算法与数据结构>的学习历程,仅作为记录自己学习状态的文章. 线性表 2021-9-14[数据结构/严蔚敏][顺序表][代码实现算法2.1-2.7] 2021-9-1 ...

  6. IT女神节(致敬中国IT界永远的女神严蔚敏-数据结构)

    我们都知道程序=数据结构+算法.相信很多人都学过严蔚敏的数据结构的课程.作为一个码农,在这不管是3.7女神节,还是3.8妇女节.我觉得都有必要向这些教育界的老前辈致敬.今天我就梳理梳理,最经典的数据结 ...

  7. 考研961数据结构c语言版真题,严蔚敏数据结构C语言版考研真题库

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 严蔚敏<数据结构>(C语言版)配套题库[考研真题精选(部分视频讲解)+章节题库] 下载来源:http://fangcai.100xuexi.c ...

  8. 数据结构习题答案(全部算法)---严蔚敏版

    第一章绪论 1.16 void print_descending(int x,int y,int z)//按从大到小顺序输出三个数 { scanf("%d,%d,%d",& ...

  9. [数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(课后习题+答案解析)

    1. 简述下列概念:数据.数据元素.数据项.数据对象.数据结构.逻辑结构.存储结构.抽象数据类型. 数据 数据是客观事物的符号表示,是所有能输人到计算机中并被计算机程序处理的符号的总称.数据是信息的载 ...

最新文章

  1. 代码 删除的stach 找回_阿里大佬教你,如何写好 Java 代码!
  2. Oracle执行SQL语句的过程
  3. 高级SQL优化(三) 常用优化工具 ——《12年资深DBA教你Oracle开发与优化——性能优化部分》...
  4. 华为荣耀20和x10比较_荣耀x10和荣耀20Pro哪个值得入手 荣耀x10和荣耀20Pro参数对比...
  5. android中图型的阴影效果(shadow-effect-with-custom-shapes)
  6. Linux上静态库和动态库的编译和使用
  7. 记一次Linux磁盘满盘/dev/vda1目录清理记录
  8. 51单片机学习笔记之定时器程序设计
  9. 要成为一个 Java 架构师得学习哪些知识以及方法?
  10. Mysql允许root用户远程访问
  11. ig 焊接机器人_发那科机器人焊接应用的IO配置(总线型)
  12. c语言怎样找无限循环小数的循环体
  13. Steam[ASF]挂卡(挂游戏时间)纯新手教学
  14. java实体类中的枚举类型_Java枚举类的使用
  15. 软件工程的可行性分析
  16. Foxmail7.0.1.86升级有风险
  17. BlueCoat被私募股权公司收购
  18. 论以建筑全生命周期管理建设公司大数据平台
  19. Baltimore System of Classifications of Viruses
  20. 为啥干不过苹果?某手机老总一语道破心中所想,赚钱才是第一位的

热门文章

  1. 云计算企业级小架构部署应用综合练习-docker变种(一)
  2. maven 中配置多个mirror的问题
  3. Android 天气APP(六)旋转风车显示风力、风向
  4. 如何调整图片像素大小
  5. node文件系统 常用文件处理方法
  6. mac系统如何修改网卡mac地址
  7. 如何注册微信个人公众号,教程来啦!怎样注册微信个人公众订阅号
  8. 1217_使用SCons生成目标文件
  9. 电压源和电流的关联参考方向_在大学《电路原理》中,电流源和电压源如何判断关联参考方向和非关联参考方向?...
  10. 大牛的学习笔记:步进电机驱动在3D打印应用