串: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算法相关推荐

  1. 数据结构-串-KMP算法详解(Next数组计算)(简单易懂)

    文章目录 KMP介绍 一.求Next数组 前后缀表 求最长公共前后缀 最长相等前后缀表转Next数组 二.使用Next数组来匹配字符串 总结 本文章就专讲kmp,暴力匹配就不讲了(我相信能搜索kmp的 ...

  2. 0x15.基本数据结构 — 字符串 (KMP算法(含详细证明)和最小表示法)

    目录 一.KMP模式匹配 1.引理: 2.引理证明: 3.使用优化的算法计算nextnextnext数组: 4.luogu P3375 [模板]KMP字符串匹配 5.UVA1328 Period 6. ...

  3. 串—KMP算法(详细)

    KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的.具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息.时间复杂度O(m+n). (1)分 ...

  4. [数据结构]模式匹配算法--KMP算法详解

    目录 一. 模式匹配 二. 模式匹配算法 1. 朴素模式匹配算法 2. KMP算法 1). KMP算法的优势 2). KMP算法的原理 3). next数组的构造 4). 利用next数组匹配的过程 ...

  5. KMP 算法并非字符串查找的优化 [转]

    算法书和数据结构书对 KMP算法多有介绍,称只需对字符串扫描一遍不需回溯云云 .然而 ,它恐怕只应该作为一种思想存在 ;用于实际的字符串查找并不理想 .要费劲心血实现和优化它 ,才能在特定的字符串上略 ...

  6. 时序分析:KMP算法用于序列识别

    考研基础资料之一的<算法与数据结构>,KMP算法作为串匹配的基本算法,为必考题目之一.对于算法入门来说,也是复杂度稍高的一个基本算法. KMP算法作为串匹配的非暴力算法,是为了减少回溯而设 ...

  7. kmp有next和nextval的C语言,KMP算法计算next值和nextVal值

    KMP算法: 给定一个主串S及一个模式串P,判断模式串是否为主串的子串:若是,返回匹配的第一个元素的位置(序号从1开始),否则返回0: 这里先不写算法,仅仅计算next和nextVal值 那么计算时只 ...

  8. 【数据结构Note4】-串、数组和广义表(kmp算法详解)

    文章目录 串.数组和广义表 1. 串 1.1 串的概念和结构 1.2 顺序串和链串 1.3 BF算法--串的模式匹配法之一 1.5 KMP算法--串的模式匹配法之一 1.5.1 next数组 1.5. ...

  9. a - 数据结构实验之串一:kmp简单应用_串的两种模式匹配方式(BF/KMP算法)

    串的两种模式匹配方式(BF/KMP算法) 前言 串,又称作字符串,它是由0个或者多个字符所组成的有限序列,串同样可以采用顺序存储和链式存储两种方式进行存储,在主串中查找定位子串问题(模式匹配)是串中最 ...

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

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

最新文章

  1. Consul 服务注册与发现01——简介|| 安装并运行Consul
  2. CTFshow 爆破 web27
  3. MATLAB中inputdlg的使用
  4. RSocket协议初识
  5. 湖南女子学院 计算机,2019湖南女子学院专业排名
  6. jooq生成records_Java 14 Records类
  7. PFSense 2.1 端口映射配置
  8. Android 应用程序之间数据共享—ContentProvider
  9. [翻译] FeSpinner
  10. 75道经典逻辑思维题及答案
  11. anki填空题卡片模板
  12. Android淑女剑之HorizontalScrollView之窈窕淑女
  13. linux roundup函数记录
  14. 一起重新开始学大数据-java篇-DAY13-ArrayList集合和装拆箱
  15. 关于图片因错误无法显示的问题j
  16. java企业级快速开发平台jeeadminlte(jeesite大胖老师修改版)
  17. 堡垒之夜 服务器显示离线,堡垒之夜怎么是离线状态 | 手游网游页游攻略大全...
  18. 【项目】健康项目day5总结
  19. mysql数据库cpu使用情况查询_数据库占用cpu较高的查询
  20. c# short_C#中的short关键字

热门文章

  1. 36Kr鬼畜推送,没事别惹程序员
  2. 第六节:又一种新的数据类型:元组Tuple
  3. 监督学习 | ID3 决策树原理及Python实现
  4. 机器学习系列补充:数据集准备和更正YSX包
  5. java random.nextbytes_Java Random类
  6. 提高篇 第三部分 图论 第1章 最小生成树
  7. P1789 【Mc生存】插火把(python3实现)
  8. NOIP2001-普及组复赛-第2题-最大公约数和最小公倍数问题
  9. 推荐一款自动化代码变量命名在线工具
  10. HarmonyOS应用如何开发,使用什么开发工具及安装使用教程说明!