数据结构之串:KMP算法
串:KMP算法
- 基本概念:
- KMP算法原理:
- KMP算法的代码实现:
- KMP算法的性能:
基本概念:
应用优化前提: 有部分匹配的前缀和后缀
KMP算法原理:
按普通的串的模式匹配算法,在1位置比较完之后,中间还有俩次比较才能到达位置2,KMP算法解决的就是如何找到直接找到位置2,继续进行比较的。
问: 为什么会找到位置2而不是其他位置?
答: 我们发现在模式串的子串(bacba)中存在相同的最长前缀(ba)和最长后缀(ba),那进行串的模式匹配时下一个匹配的位置就是后缀=前缀的位置,即将前缀移动到上一次比较的后缀的位置上在进行比较。
当移动到下一个比较位置时,主串的标志i不需要回退,继续向后比较即可
模式串的标志j就需要回退到相同前缀的下一个数据元素,回退的位数和部分匹配值相关,若用数组next[]存储部分匹配值,则有以下公式:
j-1表示上次已经匹配的子串的最后一个元素的位置,next[j-1]表示部分匹配值
问: 如何计算存储最长匹配值的数组next[]?
答:
前缀等于后缀的最长的串的长度
例:
考研当中上图的next[]数组并不是最终答案,为实现算法的便利性,考研中的next[]数组会由此数组经过若干次变化得到,变化过程如下:
问: 最终的nextp[]数组如何求得?
答:
1、右移操作,将move中的next[j-1] 变成 next[j]
2、加一操作将j = next[j] + 1变成 j = next[j] (有的教程不加1,具体与代码实现有关)
问: 如何更加高效的求解next[]数组?
答:
KMP算法的代码实现:
求next[]数组:
void get_next(String T,int next[]){int i = 1,j = 0;next[1] = 0;while(i < T.length){if(j == 0 || T.ch[i] == T.ch[j]){++i;++j;next[i] = j;}elsej = next[j];}
}
kmp算法:
int Index_KMP(String S,String T,int next[],int pos){int i = pos,j = 1;while(i <= S.length && j <= T.length){if(j == 0 || S.ch[i] == T.ch[j]){i ++;j ++; }elsej = next[j];}if(j > T,length)return i - T.length;elsereturn 0;
}
KMP算法的性能:
时间复杂度: O(m + n)
空间复杂度: O(1)
数据结构之串:KMP算法相关推荐
- 数据结构-串-KMP算法详解(Next数组计算)(简单易懂)
文章目录 KMP介绍 一.求Next数组 前后缀表 求最长公共前后缀 最长相等前后缀表转Next数组 二.使用Next数组来匹配字符串 总结 本文章就专讲kmp,暴力匹配就不讲了(我相信能搜索kmp的 ...
- 0x15.基本数据结构 — 字符串 (KMP算法(含详细证明)和最小表示法)
目录 一.KMP模式匹配 1.引理: 2.引理证明: 3.使用优化的算法计算nextnextnext数组: 4.luogu P3375 [模板]KMP字符串匹配 5.UVA1328 Period 6. ...
- 串—KMP算法(详细)
KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息.时间复杂度O(m+n). (1)分 ...
- [数据结构]模式匹配算法--KMP算法详解
目录 一. 模式匹配 二. 模式匹配算法 1. 朴素模式匹配算法 2. KMP算法 1). KMP算法的优势 2). KMP算法的原理 3). next数组的构造 4). 利用next数组匹配的过程 ...
- KMP 算法并非字符串查找的优化 [转]
算法书和数据结构书对 KMP算法多有介绍,称只需对字符串扫描一遍不需回溯云云 .然而 ,它恐怕只应该作为一种思想存在 ;用于实际的字符串查找并不理想 .要费劲心血实现和优化它 ,才能在特定的字符串上略 ...
- 时序分析:KMP算法用于序列识别
考研基础资料之一的<算法与数据结构>,KMP算法作为串匹配的基本算法,为必考题目之一.对于算法入门来说,也是复杂度稍高的一个基本算法. KMP算法作为串匹配的非暴力算法,是为了减少回溯而设 ...
- kmp有next和nextval的C语言,KMP算法计算next值和nextVal值
KMP算法: 给定一个主串S及一个模式串P,判断模式串是否为主串的子串:若是,返回匹配的第一个元素的位置(序号从1开始),否则返回0: 这里先不写算法,仅仅计算next和nextVal值 那么计算时只 ...
- 【数据结构Note4】-串、数组和广义表(kmp算法详解)
文章目录 串.数组和广义表 1. 串 1.1 串的概念和结构 1.2 顺序串和链串 1.3 BF算法--串的模式匹配法之一 1.5 KMP算法--串的模式匹配法之一 1.5.1 next数组 1.5. ...
- a - 数据结构实验之串一:kmp简单应用_串的两种模式匹配方式(BF/KMP算法)
串的两种模式匹配方式(BF/KMP算法) 前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最 ...
- 数据结构:详解KMP算法,手工求解next、nextval数组,求模式串的比较次数例题
KMP 算法 手工求解 next 数组,nextval数组 例题:求模式串的比较次数 2019 年 408 统考真题 设主串 T="abaabaabcabaabc",模式串 S=& ...
最新文章
- Consul 服务注册与发现01——简介|| 安装并运行Consul
- CTFshow 爆破 web27
- MATLAB中inputdlg的使用
- RSocket协议初识
- 湖南女子学院 计算机,2019湖南女子学院专业排名
- jooq生成records_Java 14 Records类
- PFSense 2.1 端口映射配置
- Android 应用程序之间数据共享—ContentProvider
- [翻译] FeSpinner
- 75道经典逻辑思维题及答案
- anki填空题卡片模板
- Android淑女剑之HorizontalScrollView之窈窕淑女
- linux roundup函数记录
- 一起重新开始学大数据-java篇-DAY13-ArrayList集合和装拆箱
- 关于图片因错误无法显示的问题j
- java企业级快速开发平台jeeadminlte(jeesite大胖老师修改版)
- 堡垒之夜 服务器显示离线,堡垒之夜怎么是离线状态 | 手游网游页游攻略大全...
- 【项目】健康项目day5总结
- mysql数据库cpu使用情况查询_数据库占用cpu较高的查询
- c# short_C#中的short关键字