KMP算法-严蔚敏数据结构
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算法-严蔚敏数据结构相关推荐
- 严蔚敏数据结构源码及习题解析
⭐ 我的网站: www.mengyingjie.com ⭐ 严蔚敏数据结构源码及习题解析 习题解析未更新完整,以后更新 内容已上传到github,欢迎star和fork: https://github ...
- 严蔚敏数据结构C语言版——线性表的链式存储方式详细代码
一.严蔚敏数据结构C语言版 由于书上的许多地方都是伪代码,所以下面的代码对课本上的做了一些改动,使代码能够正常运行 链表的定义即相关类型定义 typedef int ElementType; type ...
- KMP算法(严蔚敏数据结构第二版)
KMP算法之前看过一次,看了好久才看明白,今天又学的时候发现啥也不会了,又看了好久,在这里整理一下思路,方便以后复习. 算法介绍 在我们常规的模式匹配算法中,每当匹配失败时,模式串都从第一个字符开始重 ...
- 严蔚敏数据结构c++版微盘_数据结构复习知识点总结
<数据结构>重点在线性表.树.图.查找和排序.参考书目是<数据结构>(C语言版)严蔚敏.吴伟民编著.通过对线性表.队列.栈和数组的了解,进一步理解其含义,熟悉各种例如进栈.出栈 ...
- 2021-10-16【严蔚敏数据结构代码实现合集】【c语言学习必备】
本文记录了我为期三个月<算法与数据结构>的学习历程,仅作为记录自己学习状态的文章. 线性表 2021-9-14[数据结构/严蔚敏][顺序表][代码实现算法2.1-2.7] 2021-9-1 ...
- IT女神节(致敬中国IT界永远的女神严蔚敏-数据结构)
我们都知道程序=数据结构+算法.相信很多人都学过严蔚敏的数据结构的课程.作为一个码农,在这不管是3.7女神节,还是3.8妇女节.我觉得都有必要向这些教育界的老前辈致敬.今天我就梳理梳理,最经典的数据结 ...
- 考研961数据结构c语言版真题,严蔚敏数据结构C语言版考研真题库
该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 严蔚敏<数据结构>(C语言版)配套题库[考研真题精选(部分视频讲解)+章节题库] 下载来源:http://fangcai.100xuexi.c ...
- 数据结构习题答案(全部算法)---严蔚敏版
第一章绪论 1.16 void print_descending(int x,int y,int z)//按从大到小顺序输出三个数 { scanf("%d,%d,%d",& ...
- [数据结构与算法(严蔚敏 C语言第二版)]第1章 绪论(课后习题+答案解析)
1. 简述下列概念:数据.数据元素.数据项.数据对象.数据结构.逻辑结构.存储结构.抽象数据类型. 数据 数据是客观事物的符号表示,是所有能输人到计算机中并被计算机程序处理的符号的总称.数据是信息的载 ...
最新文章
- 代码 删除的stach 找回_阿里大佬教你,如何写好 Java 代码!
- Oracle执行SQL语句的过程
- 高级SQL优化(三) 常用优化工具 ——《12年资深DBA教你Oracle开发与优化——性能优化部分》...
- 华为荣耀20和x10比较_荣耀x10和荣耀20Pro哪个值得入手 荣耀x10和荣耀20Pro参数对比...
- android中图型的阴影效果(shadow-effect-with-custom-shapes)
- Linux上静态库和动态库的编译和使用
- 记一次Linux磁盘满盘/dev/vda1目录清理记录
- 51单片机学习笔记之定时器程序设计
- 要成为一个 Java 架构师得学习哪些知识以及方法?
- Mysql允许root用户远程访问
- ig 焊接机器人_发那科机器人焊接应用的IO配置(总线型)
- c语言怎样找无限循环小数的循环体
- Steam[ASF]挂卡(挂游戏时间)纯新手教学
- java实体类中的枚举类型_Java枚举类的使用
- 软件工程的可行性分析
- Foxmail7.0.1.86升级有风险
- BlueCoat被私募股权公司收购
- 论以建筑全生命周期管理建设公司大数据平台
- Baltimore System of Classifications of Viruses
- 为啥干不过苹果?某手机老总一语道破心中所想,赚钱才是第一位的
热门文章
- 云计算企业级小架构部署应用综合练习-docker变种(一)
- maven 中配置多个mirror的问题
- Android 天气APP(六)旋转风车显示风力、风向
- 如何调整图片像素大小
- node文件系统 常用文件处理方法
- mac系统如何修改网卡mac地址
- 如何注册微信个人公众号,教程来啦!怎样注册微信个人公众订阅号
- 1217_使用SCons生成目标文件
- 电压源和电流的关联参考方向_在大学《电路原理》中,电流源和电压源如何判断关联参考方向和非关联参考方向?...
- 大牛的学习笔记:步进电机驱动在3D打印应用