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]\)的一个循环节。

推论

任意循环元的长度必然是最小循环元长度的整数倍。

【文文殿下】浅谈KMP算法next数组与循环节的关系的更多相关文章

  1. 【字符串算法3】浅谈KMP算法

    [字符串算法1] 字符串Hash(优雅的暴力) [字符串算法2]Manacher算法 [字符串算法3]KMP算法 这里将讲述  [字符串算法3]KMP算法 Part1 理解KMP的精髓和思想 其实KM ...

  2. 浅谈KMP算法及其next[]数组

    KMP算法是众多优秀的模式串匹配算法中较早诞生的一个,也是相对最为人所知的一个. 算法实现简单,运行效率高,时间复杂度为O(n+m)(n和m分别为目标串和模式串的长度) 当字符串长度和字符集大小的比值 ...

  3. 浅谈KMP算法

    一.介绍 烤馍片KMP算法是用来处理字符串匹配问题的.比如说给你两个字符串A,B,问B是不是A的子串? 比如,eg就是aeggx的子串 一般讲字符串A称为主串,用来匹配的B串称为模式串 定义n为字符串 ...

  4. 浅谈KMP算法——Chemist

    很久以前就学过KMP,不过一直没有深入理解只是背代码,今天总结一下KMP算法来加深印象. 一.KMP算法介绍 KMP解决的问题:给你两个字符串A和B(|A|=n,|B|=m,n>m),询问一个字 ...

  5. 浅谈 KMP 算法

    最近在复习数据结构,学到了 KMP 算法这一章,似乎又迷糊了,记得第一次学习这个算法时,老师在课堂上讲得唾沫横飞,十分有激情,而我们在下面听得一脸懵比,啥?这是个啥算法?啥玩意?再去看看书,完全听不懂 ...

  6. 单模式串匹配----浅谈kmp算法

    模式串匹配,顾名思义,就是看一个串是否在另一个串中出现,出现了几次,在哪个位置出现: p.s.  模式串是前者,并且,我们称后一个 (也就是被匹配的串)为文本串: 在这篇博客的代码里,s1均为文本串, ...

  7. 安卓开发_浅谈ListView(SimpleAdapter数组适配器)

    安卓开发_浅谈ListView(ArrayAdapter数组适配器) 学习使用ListView组件和SimapleAdapter适配器实现一个带图标的ListView列表 总共3部分 一.MainAc ...

  8. 浅谈分词算法(5)基于字的分词方法(bi-LSTM)

    目录 前言 目录 循环神经网络 基于LSTM的分词 Embedding 数据预处理 模型 如何添加用户词典 前言 很早便规划的浅谈分词算法,总共分为了五个部分,想聊聊自己在各种场景中使用到的分词方法做 ...

  9. 浅谈分词算法(4)基于字的分词方法(CRF)

    目录 前言 目录 条件随机场(conditional random field CRF) 核心点 线性链条件随机场 简化形式 CRF分词 CRF VS HMM 代码实现 训练代码 实验结果 参考文献 ...

随机推荐

  1. C++ 获取特定进程的CPU使用率<转>

    C++ 获取特定进程的CPU使用率 近来发现笔记本在关闭屏幕后风扇转得特别快,打开屏幕后看任务管理器,风扇马上减速,也没有发现大量占用CPU的进程.于是想写一个小程序在后台记录每个进程的CPU使用情况 ...

  2. Symfony 从路由认识它

    经过上一篇文章之后,我们呢,可以访问这个默认的页面,你也会看到一堆高级的debug工具.好了,这次我们开始更多地了解这个symfony2.0. 首先我们要明白一点,Symfony2 的配置是一个着实很 ...

  3. better-scroll的用法,及其中的一个属性event._constructed详解

    better-scroll是一个页面滚动插件,用它可以很方便的实现下拉刷新,锚点滚动等功能. 实现原理:父容器固定高度,并设置overflow:hidden,子元素超出父元素高度后将被隐藏,超出部分可 ...

  4. 关于网页头图标ico的问题

    今天同事问了我一个比较奇怪的问题,对于我来说,可能和编码没什么关系,但是确实是头一次注意到,所以把问题记录了下来,方便以后积累经验. 问题就是: 在本地的网页中设置了头图标 <link rel= ...

  5. jquery text() html() val()

    test text() 返回 test html() 返回 test val() 没值, val() 适用于有value属性的元素, 例如: input

  6. Criterion - 一个简单可扩展的 C 语言测试框架

    A dead-simple, yet extensible, C test framework. Philosophy Most test frameworks for C require a lot ...

  7. 转载:Candy? 在线性时间内求出素数与欧拉函数

    转载自:http://www.cnblogs.com/candy99/p/6200660.html 2818: Gcd Time Limit: 10 Sec  Memory Limit: 256 MB ...

  8. sql时间戳转日期格式

    FROM_UNIXTIME(ctime, '%Y-%m-%d %H:%i:%s')

  9. 马婕 2014MBA专硕考试 报刊选读 6(转)

    http://blog.sina.com.cn/s/blog_3e66af4601016udh.html Protecting the weakest保护最弱势群体The recession may ...

  10. shell 用环境变量的值修改properties文件

    假设有如下属性文件 demo.properties user.name=test user.password=123456 ............................... 需求:先需要 ...