




已阅读5页,还剩13页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
4 3 2KMP算法KMP算法是D E Knuth J H Morris和V R Pratt共同提出的 简称KMP算法 该算法较BF算法有较大改进 主要是消除了主串指针的回溯 从而使算法效率有了某种程度的提高 所谓真子串是指模式串t存在某个k 0 k j 使得 t0t1 tk tj ktj k 1 tj 成立 例如 t abab 即t0t1 t2t3也就是说 ab 是真子串 真子串就是模式串中隐藏的信息 利用它来提高模式匹配的效率 一般情况 设主串s s0s1 sn 1 模式t t0t1 tm 1 在进行第i趟匹配时 出现以下情况 这时 应有 t0t1 tj 1 si jsi j 1 si 1 4 1 如果在模式t中 t0t1 tj 1 t1t2 tj 4 2 则回溯到si j 1开始与t匹配 必然 失配 理由很简单 由 4 1 式和 4 2 式综合可知 t0t1 tj 1 si j 1si j 2 si 既然如此 回溯到si j 1开始与t匹配可以不做 那么 回溯到si j 2开始与t匹配又怎么样 从上面推理可知 如果 t0t1 tj 2 t2t3 tj 仍然有 t0t1 tj 2 si j 2si j 3 si 这样的比较仍然 失配 依此类推 直到对于某一个值k 使得 t0t1 tk 2 tj k 1tj k 2 tj 1 且 t0t1 tk 1 tj ktj k 1 tj 1 才有 tj ktj k 1 tj 1 si ksi k 1 si 1 t0t1 tk 1 说明下一次可直接比较si和tk 这样 我们可以直接把第i趟比较 失配 时的模式t从当前位置直接右滑j k位 而这里的k即为next j 例如t abab 由于 t0t1 t2t3 这里k 1 j 3 则存在真子串 设s abacabab t abab 第一次匹配过程如下所示 此时不必从i 1 i i j 1 1 j 0重新开始第二次匹配 因t0 t1 s1 t1 必有s1 t0 又因t0 t2 s2 t2 所以必有s2 t0 因此 第二次匹配可直接从i 3 j 1开始 为此 定义next j 函数如下 max k 0 k j 且 t0t1 tk 1 tj ktj k 1 tj 1 当此集合非空时 1当j 0时0其他情况 next j t abab 对应的next数组如下 voidGetNext SqStringt intnext intj k j 0 k 1 next 0 1 while j t len 1 if k 1 t data j t data k k为 1或比较的字符相等时 j k next j k elsek next k 由模式串t求出next值的算法 intKMPIndex SqStrings SqStringt intnext MaxSize i 0 j 0 v GetNext t next while i t len v i t len 返回匹配模式串的首字符下标 elsev 1 返回不匹配标志 returnv KMP算法 设主串s的长度为n 子串t长度为m 在KMP算法中求next数组的时间复杂度为O m 在后面的匹配中因主串s的下标不减即不回溯 比较次数可记为n 所以KMP算法总的时间复杂度为O n m 例如 设目标串s aaabaaaab 模式串t aaaab s的长度为n n 9 t的长度为m m 5 用指针i指示目标串s的当前比较字符位置 用指针j指示模式串t的当前比较字符位置 KMP模式匹配过程如下所示 上述定义的next 在某些情况下尚有缺陷 例如 模式 aaaab 在和主串 aaabaaaab 匹配时 当i 3 j 3时 s data 3 t data 3 由next j 的指示还需进行i 3 j 2 i 3 j 1 i 3 j 0等三次比较 实际上 因为模式中的第1 2 3个字符和第4个字符都相等 因此 不需要再和主串中第4个字符相比较 而可以将模式一次向右滑动4个字符的位置直接进行i 4 j 0时的字符比较 这就是说 若按上述定义得到next j k 而模式中pj pk 则为主串中字符si和pj比较不等时 不需要再和pk进行比较 而直接和pnext k 进行比较 换句话说 此时的next j 应和next k 相同 为此将next j 修正为nextval j 比较t data j 和t data k 若不等 则nextval j next j 若相等nextval j nextval k voidGetNextval SqStringt intnextval intj 0 k 1 nextval 0 1 while j t len if k 1 t data j t data k j k if t data j t data k nextval j k elsenextval j nextval k elsek nextval k 由模式串t求出nextval值 intKMPIndex1 SqStrings SqStringt intnextval
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 【语文】湖北省武汉市实验外国语学校小学部五年级上册期末复习试题
- 深圳爱义学校初中部人教版七年级下学期文言文难题语文试题题
- 【语文】遵义市一年级下册期末复习试题(含答案)
- 2020-2021年-介词单元检测(附答案)
- (完整版)苏教七年级下册期末复习数学模拟真题题目经典套题及答案解析
- 临床检验技师考试《专业知识》巩固题及答案
- 2025土建施工员考试基础知识备考试题及答案
- 港货电商直播活动策划方案
- 建筑工程维修施工方案
- 地方营销方案
- 康复养老护理辅具研发
- 2024(苏教版)劳动六年级上册全册教学案
- 2025秋苏教版(2024)小学科学二年级上册(全册)教学设计(附目录P123)
- 2025年amOLED行业研究报告及未来行业发展趋势预测
- 钢箱梁支架搭设检查验收表
- 旅游文体翻译课件
- 植物病理学课件
- 广西基本医疗保险门诊特殊慢性病申报表
- 幼儿园小班语言活动教案《我会看书》
- DB62∕T 3171-2019 双向螺旋挤土灌注桩技术规程
- 历史时期的气候变迁PPT课件
评论
0/150
提交评论