【算法】kmp 的 getnext 函数解释

2024-05-30 05:48
文章标签 算法 函数 解释 kmp getnext

本文主要是介绍【算法】kmp 的 getnext 函数解释,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

本人的理解,供参考,如有错误请指出谢谢

设子串:ababafgda

getnext 函数的目的就是找出子串的子串的共同前后缀的长度

设变量
j = 0:
k = 1:表示循环进度,也表示当前在那个子串的子串
len = strlen(子串) = 9

while(k < len - 1)

在这里插入图片描述
匹配失败
k++ ,进入下一个子串,在 +1 之前 k 表示的是 ab 子串
j = 0,肯定要归零,要不然怎么找前缀

在这里插入图片描述
匹配成功
此时 k = 2,就表示aba子串,那么aba子串的公共最长前后缀就是 1,这个 1 只能从 j 变量获得,此时 j = 0,所以
next[k] = j+1
就是说 aba子串的公共最长前后缀就是 1
匹配结束进入下一个子串,所以 k++,所以不论成功与否 k 都是要+1的
那么 j 呢,也是要 +1 的
为什么?

aba
要获得 aba 的前后缀需要比对 ab 中的a 和 ba 中的b 的匹配 和 ab中的b 和 ba 中的a 的匹配

这里需要分两种情况

如果 ab 是匹配成功的,那么ba 就是 ab 各自下标的+1的偏移
如果不匹配就需要从头开始匹配
显然 ab 是不匹配的,所以就需要匹配 ab 的a 和ba 的 a,如果成功就说明 aba 的公共最长前后缀就是 1,不成功就是0咯

例如:abab
aba 中 ab 的a 和ba 的 a 是匹配的(见上面),所以接下来就该匹配 两个b 了,这两个b 的下标就是aba 中两个a 的下标+1

之后重复下标+1和归零的操作即可

在这里插入图片描述
匹配成功
abab 的公共最长前后缀就是 aba 公共最长前后缀 +1

有没有发现 aba 的公共最长前后缀是前缀也就是 j+1
aba 是 j 指向 a,值就是 0 ,所以需要 +1之后才能赋值给 next
但在 abab中 j 指向 aba 中的 b,值就是1,也需要 +1之后才能赋值给 next
所以可以先 +1 在赋值给next

在这里插入图片描述
匹配成功
ababa 的公共最长前后缀就是 abab 公共最长前后缀 +1

在这里插入图片描述
匹配失败
ababaf 的公共最长前后缀为 0
j 有需要归零

在这里插入图片描述
匹配失败
ababafg 的公共最长前后缀为 0
j 归零
在这里插入图片描述
匹配失败
ababafgd 的公共最长前后缀为 0
j 归零

在这里插入图片描述
匹配成功
ababafgda 的公共最长前后缀为 j+1=0

但是并不需要公共最长前后缀了,已经匹配结束了

公共最长前后缀 是为失败后下一次跳过公共的内容做准备的

前提是失败后

同理解释为什么要设
j = 0:
k = 1

一个字符的公共最长前后缀就是

这篇关于【算法】kmp 的 getnext 函数解释的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1015735

相关文章

C++中assign函数的使用

《C++中assign函数的使用》在C++标准模板库中,std::list等容器都提供了assign成员函数,它比操作符更灵活,支持多种初始化方式,下面就来介绍一下assign的用法,具有一定的参考价... 目录​1.assign的基本功能​​语法​2. 具体用法示例​​​(1) 填充n个相同值​​(2)

MySql基本查询之表的增删查改+聚合函数案例详解

《MySql基本查询之表的增删查改+聚合函数案例详解》本文详解SQL的CURD操作INSERT用于数据插入(单行/多行及冲突处理),SELECT实现数据检索(列选择、条件过滤、排序分页),UPDATE... 目录一、Create1.1 单行数据 + 全列插入1.2 多行数据 + 指定列插入1.3 插入否则更

PostgreSQL中rank()窗口函数实用指南与示例

《PostgreSQL中rank()窗口函数实用指南与示例》在数据分析和数据库管理中,经常需要对数据进行排名操作,PostgreSQL提供了强大的窗口函数rank(),可以方便地对结果集中的行进行排名... 目录一、rank()函数简介二、基础示例:部门内员工薪资排名示例数据排名查询三、高级应用示例1. 每

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

MySQL 中的 CAST 函数详解及常见用法

《MySQL中的CAST函数详解及常见用法》CAST函数是MySQL中用于数据类型转换的重要函数,它允许你将一个值从一种数据类型转换为另一种数据类型,本文给大家介绍MySQL中的CAST... 目录mysql 中的 CAST 函数详解一、基本语法二、支持的数据类型三、常见用法示例1. 字符串转数字2. 数字

Python内置函数之classmethod函数使用详解

《Python内置函数之classmethod函数使用详解》:本文主要介绍Python内置函数之classmethod函数使用方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录1. 类方法定义与基本语法2. 类方法 vs 实例方法 vs 静态方法3. 核心特性与用法(1编程客

Python函数作用域示例详解

《Python函数作用域示例详解》本文介绍了Python中的LEGB作用域规则,详细解析了变量查找的四个层级,通过具体代码示例,展示了各层级的变量访问规则和特性,对python函数作用域相关知识感兴趣... 目录一、LEGB 规则二、作用域实例2.1 局部作用域(Local)2.2 闭包作用域(Enclos

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

MySQL count()聚合函数详解

《MySQLcount()聚合函数详解》MySQL中的COUNT()函数,它是SQL中最常用的聚合函数之一,用于计算表中符合特定条件的行数,本文给大家介绍MySQLcount()聚合函数,感兴趣的朋... 目录核心功能语法形式重要特性与行为如何选择使用哪种形式?总结深入剖析一下 mysql 中的 COUNT