- 1、本文档共66页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
4.6 实战练习 一、选择合适的存储结构,并实现以下功能: (1).完成串的基本操作,如:串的赋值、比较、连接、插入、删除; (2).实现串的模式匹配,包括:BF算法和KMP算法; (3).字符串的应用:文本文件单词的计数与检索; 二、编写程序实现以下功能: 1、设计一个程序输出下图中的5*5阶的螺旋方阵。 4.6 实战练习 2、假设n*n的稀疏矩阵A采用三元组表示,设计一个程序实现如下功能: (1).生成如下两个稀疏矩阵的三元组a和b; (2).输出a+b的三元组。 4.7 小 结 理解串的定长顺序存储、堆存储及链式存储各自的优缺点,能在应用中进行合理的选择; 掌握串的堆存储结构及其实现串的各种操作的基本方法; 理解串匹配中BF算法的匹配过程及其具体实现; 理解串匹配的KMP算法,熟悉NEXT函数的定义,学会手工计算给定模式串的NEXT函数值; 理解数组的定义及顺序存储方式; 理解特殊矩阵(对角矩阵和三角矩阵)的压缩存储方式,会计算矩阵元素的存储位置; 理解稀疏矩阵的压缩存储实现,包括顺序存储及链式存储的实现。 4.3.2串的KMP匹配算法——模式匹配算法的改进 对于t=“abcabx”,有: 当j=1时,next[1]=-1; 当j=2时,j由1到j-1只有字符’a’,属于其他情况,next[2]=0; 当j=3,4时,j由1到j-1有字符’ab’、‘abc’,属于其他情况,next[j]=0; 当j=5时,j由1到j-1的串”abca”,前缀字符”a”与后缀”a”相等,可推算出k=1,所以next[5]=1; 当j=6时,j由1到j-1的串”abcab”,前缀字符”ab”与后缀”ab”相等,可推算出k=2,所以next[6]=2。 4.3.2串的KMP匹配算法——模式匹配算法的改进 j 1 2 3 4 5 6 模式串T a b c a b x next[j] -1 0 0 0 1 2 上述推理过程如下表所示: 4.3.2串的KMP匹配算法——模式匹配算法的改进 KMP算法如下: int Index(LString P, LString T){ /*返回子串T在主串P中的位置。若不存在,则函数值为0;其中T非空*/ int i=-1,j=-1; while(i=T.lenj=P.len) { if(j==-1 || T.s[i]==P.s[j]) { ++i;++j;} /*继续比较后继字符*/ else j=next[j];} /*模式串向右移动*/ } if(jP.len) return i-P.len; /*匹配成功*/ else return 0; } 4.3.2串的KMP匹配算法——模式匹配算法的改进 void get_next(LString T, int next[ ]) { /*求模式串T的next函数并存入数组next*/ j = 0; next[0] = -1; k = -1; while (j T.len) { if (k==-1 || T[j]==T[k]) { ++j; ++k; next[j] = k; } else k = next[k]; } } 4.4数组 数组的定义:一组具有相同数据类型的数据的有序集合。 数组中每一个数据称为元素,每一个元素均用统一的数组名和相应的下标确定,下标的个数取决于数组的维数。只用一个下标来区分的元素,称为一维数组;用两个下标来区分的元素,称为二维数组;用多个下标来区分的元素,称为n维数组或多维数组。 4.4.1数组的定义 线性表结构是数组结构的一个特例,而数组结构又是线性表结构的扩展。 下图为一个二维数组A[m][n]: 如果把二维数组的每一行视为一个整体,用R0=(a0,0,a0,1,…,a0,n-1)表示第1行,用R1=(a1,0,a1,1,…,a1,n-1)表示第2行,用Rm-1=(am-1,0,am-1,1,…,am-1,n-1)表示第m行,我们可以把一个二维数组A[m][n]看作是以R1,R2,…,Rm为数据元素的一个一维数组,其中的每个数组元素Ri(0≤i≤m-1)都是一个一维数组。 这样可以把二维数组视为是对线性表的一种推广。 4.4.1数组的定义 推而广之,可以把一个n维数组视为是一种线性结构,即它是每个数据元素为n-1维数组的一个一维数组;每个n-1维数组又被视为是元素为n-2维数组的一个一维数组;每个n-2维数组又被视为是元素为n-3维数组的一个一维数组;……由此可见,n维数组是一种非常复杂
文档评论(0)