第5章 串、多维数组与特殊矩阵.pptVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
数据结构与算法实践教程 李文书 内容 第5章 串、多维数组与特殊矩阵 Hot Tip 计算机上的非数值处理的对象基本上是字符串数据。字符串简称串,也是一种特殊的线性表,因此串的存储方法也就是线性表的一般方法。本章讨论字符串的基本概念、存储方法和串的基本操作。模式匹配运算字符串是最重要的操作,也是本章学习的难点。 从学习利用高级语言编制程序开始,数组是大家惯用的存储批量数据的工具,前几章讨论的线性结构的顺序存储结构也都是利用数组来描述的,那么数组本身又是怎么实现的呢?因此,学习多维数组的目的主要是了解数组类型的特点以及在高级编程语言中的实现方法。更有利于学习、理解特殊矩阵的相关运算。  抽象数据类型定义 1. 静态数组结构 (1) 子串插入 (3) 取子串 (4) 串的复制 (5) 判断串是否相等 2. 动态数组结构 (1) 初始化 (2) 插入子串 (3) 删除子串 (4) 取子串 (5) 销毁操作 5.1.3 串的链式存储 (1) 链串的初始化 (4) 链串的复制 (5) 链串的比较 (6)链串的联接 (7) 提取子链串 (8) 插入链串 (9)替换子串 5.2串的模式匹配 5.2.1 模式匹配的简单算法 其基本思想是分别利用计数指针i和j指示主串S和模式串T中当前正待比较的位置。首先将S[1]和T[1]进行比较,若不同,将S[2]和T[1]进行比较,……,直到S中的某一个字符S[i]和T[1]相同,再将它们之后的字符进行比较,若也相同,则如此继续向下比较,当S的某一个字符S[i]与T的字符T[j]不同时,则S返回到本趟开始字符的下一个字符,即S[i-j+2],T返回到T[1],继续开始下一趟的比较,重复上述过程。若T中的字符全部比完,则说明本趟匹配成功,否则,匹配失败。 设主串S=“ababcabcacbab”,模式串T=“abcac”,匹配过程如图5.3所示。 其算法执行步骤可描述为: (1)判断匹配位置是否到串的末尾; (2)如果主串与模式串对应字符相等,继续匹配下一字符; (3)否则主串、子串指针回溯重新开始下一次匹配数据元素; (4)判断是否匹配成功。 前面我们已经用串的其他操作实现了模式匹配的算法index()。现在考虑不用串的其它操作,而是用基本的数组来实现同样的算法。注意这里假设主串S和要匹配的子串T的长度都存在S[0]和T[0]中,对应的代码见算法5.23。其中i用于主串S中当前位置下标值,若pos不为1,则从pos位置开始匹配,j是用于子串T中当前位置下标值,若i小于S的长度并且j小于T的长度时,循环继续。 当模式串为,而主串为“00000000000000000000000000000000000000000 00000000000”时,由于模式中前7个字符均为“0”,主串中前52个字符?也均为“0”,每趟比较都在模式的最后一个字符出现不等时,将指针回溯i-6的位置上,并从模式的第一个字符开始重新比较,整个匹配过程中指针i 需要回溯45次,则while循环次数为46*8(index*m)。可见,算法5.23在最坏的情况下的时间复杂度为。这种情况在只有0、1两个字符的文本串处理中经常出现。01串可以用在许多应用之中,比如一些计算机的图形显示就是用画面表示为一个01串,一页书就是一个几百万个0和1组成的串。在二进位计算机上实际处理的都是01串,一个字符的ASCII码也可以看作是8个二进位的01串。包括汉字存储在计算机中处理时也是作为一个01串和其他的字符串一样看待。因此,我们有必要介绍一种改进的模式匹配算法。 5.2.2 KMP算法 这种算法是由D.E.Knuth与V.R.Pratt和J.H.Morris同时发现的,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。此算法可以在O(n+m)的时间数量级上完成串的模式匹配操作。其改进在于:每当一趟匹配过程中出现字符比较不等时,不需回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向右“滑动”尽可能远的一段距离后,继续进行比较。下面先从具体例子看起。 回顾图5.3中的匹配过程示例,在第三趟的匹配中,当i=7、j=5字符比较不等时,又从i=4、j=1从新开始比较。然而,经仔细观察发现,在i=4和j=1,i=5和j=1以及i=6和j=1这3次比较都不必进行的。因为从第三趟部分匹配的结果就可得出,主串中第4、5和6个字符必然是‘b’、‘c’和‘a’(即模式串第2、3和4个字符)。因为模式中的第一个字符是a,因此它无需再和这3个字符进行比较,而仅需将模式串向右滑动3个字符的位置进行i=7、j=2时的字符比较即可。同理,在第一趟匹配中出现字符不等时,仅需将模式串向右移动两个字符的位置继续进行i=3、j=1时的字符比较。由此,在

文档评论(0)

wxc6688 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档