




已阅读5页,还剩15页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
字符串 模式匹配 模式匹配 在一个字符串 主串 中定位另一个串 子串 模式 基本方法 将主串S中某个位置i起始的子串和模式串T相比较 即从j 0起比较S i j 与T j 若相等 则在主串S中存在以i为起始位置匹配成功的可能性 继续往后比较 j逐步增1 直至与T串中最后一个字符相等为止 否则改从S串的下一个字符起重新开始进行下一轮的 匹配 即将串T向后滑动一位 即i增1 而j退回至0 重新开始新一轮的匹配 当这样一个失配发生时 T下标必须回溯到开始 S下标回溯的长度与T相同 然后S下标增1 然后再次比较 例如 在串S abcabcabdabba 中查找T abcabd 先是比较S 0 和T 0 是否相等 然后比较S 1 和T 1 是否相等 我们发现一直比较到S 5 和T 5 才不等 这次立刻发生了失配 T下标又回溯到开始 S下标增1 然后再次比较 失配 匹配 intIndex BF charS charT intpos inti pos j 0 while S i j 0 串S中 第pos个字符起 不存在和串T相同的子串 Index BF 问题 若串S中从第pos S的下标0 pos StrLength S 个字符起存在和串T相同的子串 则称匹配成功 返回第一个这样的子串在串S中的下标 否则返回 1 设母串S的长度为m 模式串T的长度为n 则算法Index BF的时间复杂度为 T n O m n 最坏情况 每一趟不成功的匹配都发生在T的最后一个字符 设匹配成功发生在Si处 则字符比较次数在前面i 1趟供比较了 i 1 m次 第i趟匹配成功共比较m次 总共比较了i m次 共需要n m 1趟比较 最坏情况的比较次数是 n m 1 m 其时间复杂度为O m n Cook于1970年证明的一个理论得到 任何一个可以使用被称为下推自动机的计算机抽象模型来解决的问题 也可以使用一个实际的计算机 更精确的说 使用一个随机存取机 在与问题规模对应的时间内解决 特别地 这个理论暗示存在着一个算法可以在大约m n的时间内解决模式匹配问题 D R Knuth和V R Pratt努力地重建了Cook的证明 由此创建了这个模式匹配算法 大概是同一时间 J H Morris在考虑设计一个文本编辑器的实际问题的过程中创建了差不多是同样的算法 克努特 莫里斯 普拉特 KMP算法 并不是所有的算法都是 灵光一现 中被发现的 而理论化的计算机科学确实在一些时候会应用到实际的应用中 斯蒂芬 库克 StephenA Cook 1961年从UniversityofMichigan获得其学士学位 于1962年和1966年从哈佛大学分别获得其硕士与博士学位 1966年到1970年 Stephen在加州Berkeley分校担任助理教授职务 1970年 Stephen加盟多伦多大学并工作直到现在 他是NP完全性理论的奠基人 1971年发表Cook定理奠定了NP完全理论的基础而获1982年图灵奖 Cook是对计算复杂性理论有突出贡献的计算机科学家之一 在1998年加盟苹果电脑担任全球业务高级副总裁之前 Cook先生曾任康柏 Compaq 企业材料副总裁 负责采购 管理康柏的产品存货 在这之前 Cook先生是IntelligentElectronics经销商部门的首席运营官 Cook先生还曾在IBM供职12年之久 他在IBM最近的职务为北美业务执行主管 负责IBM的PersonalComputerCompany在北美和拉美的制造和分销运作 第一趟匹配ababcabcacbababc第二趟匹配ababcabcacbababcac第三趟匹配ababcabcacbab a bcac i 2 j 2 i 6 i j 0 j 4 i 10 i j 1 j 5 s ababcabcacbab t abcac 需要解决的问题 当匹配过程中产生 失配 si tj 时 模式串 向右滑动 可行的距离多远 当主串中第i个字符与模式中第j个字符 失配 时 主串中第i字符应与模式中哪个字符再比较 t abaababc t abaabcac 设 s s0s1s2 sn 1 t t0t1t2 tm 1 当si tj时存在 t0t1 tj 1 si jsi j 1 si 1 若模式串t中存在可互相重叠的最大真子串满足 t0t1 tk 1 tj kti k 1 tj 1 0 k j 则下一次比较可直接从模式的第k 1个字符tk开始与目标串的第i 1个字符si相对应继续进行下一趟匹配 若模式串中不存在上述真子串 则下一次比较可直接从模式串的第1个字符t0开始与目标串s的第i 1个字符si相对应继续进行下一趟的匹配 如下例所示 当第一次搜索到S 5 和T 5 不等后 S下标不是回溯到1 T下标也不是回溯到开始 而是根据T中T 5 d 的模式函数值 next 5 2 直接比较S 5 和T 2 是否相等 因为相等 S和T的下标同时增加 因为又相等 S和T的下标又同时增加 最终在S中找到了T KMP匹配算法和简单匹配算法效率比较 一个极端的例子是 在S AAAAAA AAB 100个A 中查找T AAAAAAAAAB 简单匹配算法每次都是比较到T的结尾 发现字符不同 然后T的下标回溯到开始 S的下标也要回溯相同长度后增1 继续比较 如果使用KMP匹配算法 就不必回溯 时间复杂度从O m n 降为O m n KMP算法的核心思想 利用已经得到的部分匹配信息来进行后面的匹配过程 T 5 d 的模式函数值等于2 即 next 5 2 表示T 5 d 的前面有2个字符和开始的两个字符相同 且T 5 d 不等于开始的两个字符之后的第三个字符 T 2 c 如果开始的两个字符之后的第三个字符也为 d 那么 尽管T 5 d 的前面有2个字符和开始的两个字符相同 T 5 d 的模式函数值也不为2 而是为0 next函数 1 next 0 1 任何串的第一个字符的模式值规定为 1 2 next j 1 模式串t中下标为j的字符 如果与首字符相同 且j的前面的1 k个字符与开头的1 k个字符不等 或者相等但t k t j 1 k j如 t abCabCad 则next 6 1 因t 3 t 6 3 next j k 模式串t中下标为j的字符 如果j的前面k个字符与开头的k个字符相等 且tj tk 1 k j 即 t0t1t2 tk 1 tj ktj k 1tj k 2 tj 1 且tj tk 1 k j 4 next j 0 除 1 2 3 的其他情况 例1 求T abcac 的模式函数的值next 0 1根据 1 next 1 0根据 4 因 3 有1 k j 不能说 j 1 T j 1 T 0 next 2 0根据 4 因 3 有1 k j T 0 a T 1 b next 3 1根据 2 next 4 1根据 3 T 0 T 3 且T 1 T 4 若T abcab 为什么T 0 T 3 还会有next 4 0 因为T 1 T 4 根据 3 且T j T k 被划入 4 例2 求T ababcaabc 的模式函数的值next 0 1根据 1 next 1 0根据 4 next 2 1根据 2 next 3 0根据 3 虽T 0 T 2 但T 1 T 3 被划入 4 next 4 2根据 3 T 0 T 1 T 2 T 3 且T 2 T 4 next 5 1根据 2 next 6 1根据 3 T 0 T 5 且T 1 T 6 next 7 0根据 3 虽T 0 T 6 但T 1 T 7 被划入 4 next 8 2根据 3 T 0 T 1 T 6 T 7 且T 2 T 8 即 next 3 0 而不是 1 next 6 1 而不是 1 next 8 2 而不是 0 例3 求T abCabCad 的模式函数的值 next 5 0根据 3 虽T 0 T 1 T 3 T 4 但T 2 T 5 next 6 1根据 2 虽前面有abC abC 但T 3 T 6 next 7 4根据 3 前面有abCa abCa 且T 4 T 7 若T 4 T 7 即T adCadCad 则next 7 0 而不是 4 因为T 4 T 7 next函数值究竟是什么含义 设在字符串S中查找模式串T 若S m T n 那么 取T n 的模式函数值next n 1 next n 1表示S m 和T 0 间接比较过了 不相等 下一次比较S m 1 和T 0 2 next n 0表示比较过程中产生了不相等 下一次比较S m 和T 0 3 next n k 0但k n 表示S m 的前k个字符与T中的 开始k个字符已经间接比较相等了 下一次比较S m 和T k 相等吗 4 其他值 voidget next constchar T intnext 求模式串T的next函数值并存入数组nextintj 0 k 1 next 0 1 while T j 0 if k 1 T j T k j k if T j T k next j k elsenext j next k ifelsek next k while get next 求串T的模式值next n 的函数 get next函数的另一种写法voidget next 1 char t intnext intj 0 k 1 next 0 1 while t j 0 if k 1 intKMP char s char t intnext intindex 0 i 0 j 0 if s t t 0 0 s 0 0 return 1 空指针或空串 返回 1while s i 0 匹配失败 intmain char s babsdsdhfhfhfhadCadCadcaabcaababcbaaaabaaacababcaabc char t adCadCad
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 智慧服务估值体系-洞察与解读
- 2025年及未来5年中国整体软装市场供需现状及投资战略研究报告
- 提前转正的手续合同5篇
- 2025河南郑州工程技术学院高层次人才招聘81人考前自测高频考点模拟试题完整参考答案详解
- 班组日常安全培训记录课件
- 智能洗衣机故障诊断-洞察与解读
- 2025湖南张家界市医疗保障局聘用公益性岗位人员模拟试卷及答案详解(典优)
- 2025湖南省社会科学院湖南省人民政府发展研究中心招聘高层次人才14人模拟试卷附答案详解(突破训练)
- 2025贵州雍福产业发展投资(集团)有限公司第一批招聘5人考前自测高频考点模拟试题有完整答案详解
- 2025广西姆洛甲文化旅游投资有限公司公开招聘1人考前自测高频考点模拟试题附答案详解
- 2025主播签约合同范本
- 2025年咸阳机场安检员考试试题及答案
- 租房商场柜台合同(标准版)
- 湖北宜昌长阳清江水务投资控股集团有限公司招聘笔试题库2025
- (零模)南昌市2025年高三年级九月测试语文试卷(含标准答案)
- Hytera海能达HM780 说明书
- 小学生解决万以内退位减法错误类型及影响研究
- GB/T 14294-2008组合式空调机组
- 福建师范大学2023年815写作与翻译考研真题(回忆版)
- 【语法】形容词的最高级-完整版课件
- 幼儿园大班数学:《层级分类》 课件
评论
0/150
提交评论