- 1、本文档共56页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
数据结构(CC语言版)第4章串
第四章 字符串 字符串及其运算 字符串的实现 模式匹配(子串查找) 问题: t =“ababcabcacbabcacbbaaccabccaa”, p =“abcac” 如何实现 p与 t 的匹配? C语言中的字符串直接用字符数组表示,最后用结束符’\0’,串长度通过检查结束符确定,可看作一种实现方式 许多语言提供了标准字符串库,如C语言标准库有一组字符串函数(string.h),一些C语言系统提供的扩展的字符串库,C++ 语言标准库里的字符串库string,Java 标准库的字符串库,许多脚本语言提供了功能丰富的字符串库 许多实际字符串库用动态顺序表结构作为字符串的表示方式。这样既能支持任意长的字符串,又能比较有效地实现各种重要的字符串操作 实际上,支持不同的字符串操作,可能需要不同的实现。例如要保存整本的书,将需要支持若干MB 或更长的字符串,采用连续存储,也可能带来一些问题 生物学:DNA是很长的分子,存在于细胞核中。DNA 内有四种碱基:腺嘌吟(adenine),胞嘧啶(cytosine),鸟嘌吟(guanine),胸腺嘧啶(thymine)。其不同组合形成氨基酸、蛋白质和其他更高级的生命结构 DNA 片段可看作是a,c,g,t构成的模式,如acgatactagacagt。考查在蛋白质中是否出现某DNA 片段,可看成与该DNA 片段的模式匹配问题。DNA 分子可以切断和拼接,切断动作由各种酶完成,酶也是用特定的模式确定剪切位置 由于在计算机科学、生物信息学等许多领域的重要应用,串模式匹配已经变成了一个非常重要的计算问题 常用的模式匹配算法: 朴素的模式匹配(BF算法) 无回溯的模式匹配(KMP算法) 其他模式匹配算法 int StringT::FindBF(StringT s, int pos) { int j=pos, i=0; while(jm_Length is.m_Length) if(m_Data[j]==s.m_Data[i]) { j++; i++; } else { j=j-i+1; i=0; } // “回溯” if(j==s.m_Length) return j-i; else return -1; } 4.3 模式匹配 特点: 算法简单,易理解,但效率低。 影响效率的主要原因是执行中有回溯:比较不等时将模式串右移一个字符,重新开始比较。 算法中没有利用前面已做过的字符比较信息。 4.3 模式匹配 4.3 模式匹配 朴素的模式匹配——BF算法分析 为什么BF算法时间性能低? 在每趟匹配不成功时存在大量回溯,没有利用已经部分匹配的结果。 如何在匹配不成功时主串不回溯? 主串不回溯,模式就需要向右滑动一段距离。 如何确定模式的滑动距离? 4.3 模式匹配 为了理解KMP算法,首先要了解朴素算法的缺陷现在仔细考察一下朴素匹配算法的执行过程。 设有主串t =“ababcabcacbab”, 模式串p =“abcac”。 由D. E. Knuth 和V. R. Pratt 提出, J. H. Morris 几乎同时发现这一算法。因此又称为KMP 算法 BF算法的改进——KMP算法 4.3 模式匹配 请抓住部分匹配时的两个特征: (1)设模式滑动到第k个字符,则T1~Tk-1 =Si-(k-1) ~ Si-1 S=a b a b c a b c a c b a b T=a b c a c i k j S=a b a b c a b c a c b a b T=a b c a c i k 模式匹配——KMP算法 4.3 模式匹配 请抓住部分匹配时的两个特征: 两式联立可得:T1~Tk-1=Tj-(k-1) ~Tj-1 (2)则Tj-(k-1) ~ Tj-1 =Si-(k-1) ~ Si-1 S=a b a b c a b c a c b a b T=a b c a c i k j i S=a b a b c a b c a c b a b T=a b c a c j k 模式匹配——KMP算法 (1)设模式滑动到第k个字符,则T1~Tk-1 =Si-(k-1) ~ Si-1 4.3 模式匹配 T1…Tk-1=Tj-(k-1) …Tj-1说明了什么? (1) k 与 j 具有函数关系,由当前失配位置 j ,可以计算出滑动位置 k(即比较的新起点); (2)滑动位置k 仅与模式串T有关。 从第1位往右 经过k-1位 从j-1位往左 经过k-1位 k=max { k |1kj 且T1…Tk-1=Tj-(k-1) …Tj-1 } T1…Tk-1=T
文档评论(0)