KMP算法相關

轉載自:http://blog.sina.com.cn/s/blog_85b0ae450101j2iy.html

KMP算法由兩部分組成:

第一部分,計算模式串的next或nextval數組。

第二部分,利用計算好的模式串的nextval數組,進行模式匹配。

KMP算法中有next數組和nextval數組之分。他們代表的意義和作用完全一樣,完全可以混用。

唯一不同的是,next數組在一些情況下有些缺陷,而nextval是為了彌補這個缺陷而產生的。

一、求解next

步驟:

next數組值的程序設計求解方法:首先可以肯定的是第一位的next值為0,第二位的next值為1,后面求解每一位的next值時,根據前一位進行比較。首先將前一位與其next值對應的內容進行比較,如果相等,則該位的next值就是前一位的next值加上1;如果不等,向前繼續尋找next值對應的內容來與前一位進行比較,直到找到某個位上內容的next值對應的內容與前一位相等為止,則這個位對應的值加上1即為需求的next值;如果找到第一位都沒有找到與前一位相等的內容,那么需求的位上的next值即為1。

舉例:

模式串 a b a a b c a c

next值 0 1 1 2 2 3 1 2

1.前兩位必為0,1。

2.計算第三位的時候,看第二位b的next值,為1,則把b和1對應的a進行比較,不同,則第三位a的next的值為1,因為一直比到最前一位,都沒有發生比較相同的現象。

3.計算第四位的時候,看第三位a的next值,為1,則把a和1對應的a進行比較,相同,則第四位a的next的值為第三位a的next值加上1,為2。因為是在第三位實現了其next值對應 的值與第三位的值相同。

4.計算第五位的時候,看第四位a的next值,為2,則把a和2對應的b進行比較,不同,則再將b對應的next值1對應的a與第四位的a進行比較,相同,則第五位的next值為第二位b的 next值加上1,為2。因為是在第二位實現了其next值對應的值與第四位的值相同。

5.計算第六位的時候,看第五位b的next值,為2,則把b和2對應的b進行比較,相同,則第六位c的next值為第五位b的next值加上1,為3,因為是在第五位實現了其next值對應的 值與第五位相

6.計算第七位的時候,看第六位c的next值,為3,則把c和3對應的a進行比較,不同,則再把第3位a的next值1對應的a與第六位c比較,仍然不同,則第七位的next值為1。

7.計算第八位的時候,看第七位a的next值,為1,則把a和1對應的a進行比較,相同,則第八位c的next值為第七位a的next值加上1,為2,因為是在第七位和實現了其next值對應的值與第七位相同。

二、求解nextval:

求nextval數組值有兩種方法,一種是不依賴next數組值直接用觀察法求得,一種方法是根據next數組值進行推理,兩種方法均可使用,視更喜歡哪種方法而定。

本文主要分析nextval數組值的第二種方法:

模式串 a b a a b c a c

next值 0 1 1 2 2 3 1 2

nextval值 0 1 0 2 1 3 0 2

1.第一位的nextval值必定為0,第二位如果於第一位相同則為0,如果不同則為1。

2.第三位的next值為1,那么將第三位和第一位進行比較,均為a,相同,則,第三位的nextval值為0。

3.第四位的next值為2,那么將第四位和第二位進行比較,不同,則第四位的nextval值為其next值,為2。

4.第五位的next值為2,那么將第五位和第二位進行比較,相同,第二位的next值為1,則繼續將第二位與第一位進行比較,不同,則第五位的nextval值為第二位的next值,為1。

5.第六位的next值為3,那么將第六位和第三位進行比較,不同,則第六位的nextval值為其next值,為3。

6.第七位的next值為1,那么將第七位和第一位進行比較,相同,則第七位的nextval值為0。

7.第八位的next值為2,那么將第八位和第二位進行比較,不同,則第八位的nextval值為其next值,為2。

三、next和nextval比較

Next數組的缺陷舉例如下:

比如主串是“aab…..” 省略號代表后面還有字符。

模式串“aac”

通過計算aac的next數組為012(另外,任何字符串的第二位字符的next總是1,因此你可以認為他固定為1)

當模式串在字符c上失配時,會跳到第2個字符,然后再和主串當前失配的字符重新比較,即此處用模式串的第二個a和主串的b比較

即aab->aac

顯然a也不等於b。然后會跳到1,接着比,然后又失配,直到最后才使主串后移一位。

而“aac”的nextval數組為002當在c失配時會跳到2,若還失配就直接跳到0,比next數組少比較了1次。

在如果模式串很長的話,那可以省去很多比較,因此你應該使用nextval數組。

kmp有next和nextval的C语言,KMP模式匹配算法中next和nextval的求解(轉)相关推荐

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

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

  2. 模式匹配算法----KMP算法以及next数组的解法

    KMP算法:求字符串匹配(也叫模式匹配)的算法,即给定一个字符串,求其某一子串在其中出现的位置. 普通模式匹配 例如:给定字符串为abcabaaabaabcac,求其子串abaabcac在其中出现的位 ...

  3. 第四章:2.串 -- 串的模式匹配算法(KMP)

    前言: 目录: 1.串类型的定义 2.串的表示和实现 3.串的模式匹配算法 4.串操作应用举例 正文: 串的模式匹配即,在给定主串S 中,搜索子串T 的位置,如果存在T 则返回其所在位置,否则返回 0 ...

  4. Problem C: 算法4-6:KMP字符串模式匹配算法实现

    Problem Description KMP算法是字符串模式匹配算法中较为高效的算法之一,其在某次子串匹配母串失败时并未回溯母串的指针而是将子串的指针移动到相应的位置.严蔚敏老师的书中详细描述了KM ...

  5. a - 数据结构实验之串一:kmp简单应用_数据结构(C语言版)_笔记_3

    第4章 串 计算机上的非数值处理的对象基本上是字符串数据. 字符串一般简称为串. 4.1 串类型的定义 串(string)(或字符串)是由零个或多个字符组成的有限序列,一般记为其中s是串的名,单引号括 ...

  6. 串--串的定义,顺序、链式存储结构,BF、KMP模式匹配算法(C语言描述)

    此文章仅作为自己学习过程中的记录和总结,同时会有意地去用英文来做笔记,一些术语的英译不太准确,内容如有错漏也请多指教,谢谢! 一.串(String)的定义: 串(String):由零个或多个字符组成的 ...

  7. 数据结构(C语言版)严蔚敏(字符串的模式匹配算法--KMP算法)

    数据结构(C语言版)严蔚敏(字符串的模式匹配算法–KMP算法) 1.暴力匹配算法 // 暴力匹配算法 int Index2(SString S,SString T) {// S是主串,T是子串int ...

  8. 【GO语言实现字符串匹配算法-KMP算法】

    [GO语言实现字符串匹配算法-KMP算法] KMP算法原理说明: KMP算法是一种改进的字符串匹配算法,是有D.E.Knuth,J.H.Morris和V.R.Pratt提出的,所以被称为KMP算法. ...

  9. C语言——KMP算法与改进

    复习一哈:KMP算法_青岛大学_王卓https://www.bilibili.com/video/BV1nJ411V7bd?p=67 结果: 源码用到了c++中的string类 C++--String ...

最新文章

  1. Linux服务器防火墙白名单设置
  2. 《Ansible权威指南》一1.7 Ansible的安装部署
  3. GitHub:再见,master!
  4. linux(CentOs6)下jdk安装,mysql安装,tomcat安装,及web项目部署
  5. A Free CDN For Open Source
  6. static静态关键词 1214
  7. 深度相机---(4)三种方案对比
  8. 1009 C语言 SUM problem
  9. [论文阅读] Boosting Salient Object Detection with Transformer-based Asymmetric Bilateral U-Net
  10. Android PDF文件阅读方案
  11. 无法访问工作组计算机修复工具,局域网共享一键修复工具
  12. Python + Selenium 爬取网易云课堂课时标题及时长
  13. web测试的基本测试点
  14. ICIP论文结构整理
  15. markdown合并单元格
  16. c语言模拟开关题目,8x16 模拟开关阵列芯片 CH446Q.PDF
  17. iOS-内购注意 沙盒二次验证
  18. 设备电容老化危害大,出厂测试可别轻视它!
  19. pfx格式是什么文件
  20. 微信小程序获取openid等参数报错errcode:48001 errmsg:'api unauthorized'

热门文章

  1. 简单的Verilog测试模板结构
  2. Unity(TransForm)
  3. 新版jmeter图形化报告解析
  4. 负载均衡调度算法追溯
  5. @wraps 修饰器:让你的 Python 代码更加简短可爱 | 从简单实例来认识它
  6. BZOJ 4037 [HAOI2015]数字串拆分 ——动态规划
  7. 【李宏毅2020 ML/DL】P10 Classification_1 | 简单的例子告诉你使用 wx+b 以及 Sigmoid 作为激活函数的合理性
  8. java swing 图片上加热点_外卖图片品牌全靠P,4元成本料理包加热后,平台上20元卖出...
  9. EDA实验课课程笔记(一)——linux操作系统及linux下的基本指令
  10. Windows下配置Squid反向代理服务器