【文文殿下】浅谈KMP算法next数组与循环节的关系
KMP算法
KMP算法是一种字符串匹配算法,他可以在O(n+m)的时间内求出一个模式串在另一个模式串下出现的次数。
KMP算法是利用next数组进行自匹配,然后来进行匹配的。
Next数组
Next数组表示一个前缀的最长proper的长度。
简单地讲,$S[1 \sim next[i]] = S[next[i]+1 \sim i] $.
循环节
一个字符串\(S\),若是由字符串\(P\)重复\(k(k>1)\)次形成的,则称字符串\(P\)是\(S\)的一个循环节。使\(k\)最大的循环节被称为最小循环节。
引理:
对于一个字符串的前缀\(S[1 \sim i]\),它存在一个长度为\(len\)的循环节,当且仅当\(len|i\),\(len<i\),且\(S[1 \sim len]=S[len+1 \sim i]\).
即\(len\)为\(S[i]\)的一个\(proper\)长度且\(len\)整除\(i\).
显然,当\(len\)取\(i-next[i]\)时,求得的循环节为最小循环节。通过\(next\)数组的不断迭代,可以求出前缀\(S[i]\)的所有循环节。
对于引理的证明
先证必要性。设\(S[1 \sim i]\)具有长度为\(len\)的循环节,显然\(len\)整除\(i\),并且\(S[1 \sim i-len]\)和\(S[len+1 \sim i]\)都是由\(i/len-1\)个循环节构成的。故\(S[1 \sim i-len]=S[len+1 \sim i]\).
再证充分性。设\(len\)整除\(i\),并且\(S[len+1 \sim i]=S[1 \sim i-len]\),因为\(len<i\),所以\(S[1 \sim i-len]\)和\(S[len+1 \sim i]\)的长度不小于\(len\)且是\(len\)的倍数。各区前\(len\)个字符,有\(S[1 \sim len]=S[len+1 \sim 2*len]\),可以发现,他们是以\(len\)为间隔错位对齐的。故\(S[1 \sim len]\)是\(S[i]\)的一个循环节。
推论
任意循环元的长度必然是最小循环元长度的整数倍。
转载于:https://www.cnblogs.com/Syameimaru/p/9828296.html
【文文殿下】浅谈KMP算法next数组与循环节的关系相关推荐
- music算法_“要热爱 请深爱”系列(5)浅谈模拟退火算法
黄乐天 浅谈模拟退火算法 背景 在实际生活中, 数学问题中,我们常常会遇到(一定范围内)函数求最值的问题.一般可以用数学方式解答,但如果遇到如下恶心的函数: 它的函数图像是这样的: 我们只好用计算机科 ...
- java的byte php_java_浅谈java的byte数组的不同写法,(由于篇幅原因阐述的不够详 - phpStudy...
浅谈java的byte数组的不同写法 (由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"b ...
- 浅谈PPO算法-玩转月球登陆
浅谈PPO算法-玩转月球登陆 前言 github 什么是Actor-Critic? Actor-Critic代码 ppo算法 实现 前言 总感觉强化学习公式真难学,也难表达心中所想,我还是白话强化学习 ...
- java中定义byte数组,浅谈java的byte数组的不同写法
(由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"byte数组"里面全部是&qu ...
- java 字符串转list_浅谈java 字符串,字符数组,list间的转化
1.关于java.lang.string.split xxx.split()方法可以将一个字符串分割为子字符串,然后将结果作为字符串数组返回. 2.字符串转字符数组 String str =" ...
- java定义byte数组_浅谈java的byte数组的不同写法
(由于篇幅原因阐述的不够详细科学,不喜勿喷). 经常看到java中对byte数组的不同定义,粗略整理的一下: 一个字节(byte)=8位(bit),"byte数组"里面全部是&qu ...
- 浅谈UML类图中类之间的5种关系
什么是UML类图? 类图显示了一组类.接口.协作以及他们之间的关系.在UML中问题域最终要被逐步转化,通过类来建模,通过编程语言构建这些类从而实现系统.类加上他们之间的关系就构成了类图,类图中还可以包 ...
- 浅谈Manacher算法与扩展KMP之间的联系
首先,在谈到Manacher算法之前,我们先来看一个小问题:给定一个字符串S,求该字符串的最长回文子串的长度.对于该问题的求解,网上解法颇多,时间复杂度也不尽相同,这里列述几种常见的解法. 解法一 ...
- KMP算法next数组详解
==> 学习汇总(持续更新) ==> 从零搭建后端基础设施系列(一)-- 背景介绍 KMP算法的核心就是利用已匹配的信息来指导模式串的匹配.这里的已匹配信息叫做部分匹配表,也叫做next数 ...
最新文章
- 2018蓝桥杯省赛java_蓝桥杯2018年A组省赛
- 剧透人生!你什么时候结婚换工作甚至狗带,Facebook都知道
- [渝粤教育] 广东-国家-开放大学 21秋期末考试社会学概论10082k1
- linux uboot启动流程分析,uboot启动流程分析
- Spark精华问答 | 怎么运行Spark?
- 几行代码实现谷歌百度搜索对比
- Java 进阶:集合框架2
- Win8 Metro(C#)数字图像处理--2.39二值图像投影
- flutter加载本地图片
- ENVI下Landsat8辐射定标与大气校正
- CDOJ 1131 男神的礼物 区间dp
- dummy像元概念定义
- Js 的防抖与节流代码分析
- 西门子S7-200 Smart PLC下载
- 利用Unicode控制字符-RLO构造欺骗性文件后缀
- 零基础Python完全自学教程15:Python中的列表
- 中国个人站长上的四个大当
- 转业费计算器2019_士官复员费标准来了!附转业明细对比表
- c语言常用的库,C语言的一些常用标准库分享
- 花了小半个月工资,我还是对培训机构下了手
热门文章
- C语言的数据类型→浮点型数据
- VMware (CentOS 6.x)克隆导致的网卡问题
- JS、CSS合并带来的效率提升
- hadoopshpython_让python在hadoop上跑起来
- android 模拟器 3D 开发环境配置
- HDFS超租约异常总结(org.apache.hadoop.hdfs.server.namenode.LeaseExpiredException)
- theme为dialog的Activity如何充满全屏
- 基于 Android Architecture Components 的 MVVM 浅析
- Docker虚拟机理论
- 新物种!大数据安全工程研究中心告诉你什么叫“数据安全成熟度测评师”