字符串及线性结构的扩展.ppt
《字符串及线性结构的扩展.ppt》由会员分享,可在线阅读,更多相关《字符串及线性结构的扩展.ppt(80页珍藏版)》请在三一办公上搜索。
1、2023/11/13,数据结构讲义,1,第4章 字符串及线性结构的扩展,教学内容:4.1 字符串 4.2 数组 4.3 广义表教学目的:(1)了解串、数组、广义表几中特殊的线形表的定义;(2)理解和领会串的存储方式和掌握常用的串运算;(3)理解多维数组的结构特点和在内存中的两种顺序存储方式;(4)领会稀疏矩阵的压缩方式和简单运算。,2023/11/13,数据结构讲义,2,教学重点:(1)串和数组的逻辑结构、基本运算(2)串的两种存储方式(3)串的模式匹配算法(4)多维数组的两种顺序存储方式(5)对称矩阵、三角矩阵的压缩存储方式(6)稀疏矩阵的三元组表表示方法教学难点:(1)串的模式匹配(2)串
2、的综合应用(3)稀疏矩阵压缩存储表示下的运算实现学时安排:4学时,2023/11/13,数据结构讲义,3,4.1 字符串,4.1.1 字符串的基本概念4.1.2 顺序串4.1.3 模式匹配,2023/11/13,数据结构讲义,4,4.1.1 字符串的基本概念,字符串(简称为串)是数据元素为字符的线性表,它的是由零个或多个任意字符组成的字符序列。一般记作:s=”s1 s2 sn”。其中s 是串名;在本书中,用双引号作为串的定界符,引号引起来的字符序列为串值,引号本身不属于串的内容;si(1=i=n)是一个任意字符,它称为串的元素,是构成串的基本单位,i是它在整个串中的序号;n为串的长度,表示串中
3、所包含的字符个数,当n=0时,称为空串,通常记为。,2023/11/13,数据结构讲义,5,几个概念:子串与主串:串中任意连续的字符组成的子序列称为该串的子串。包含子串的串相应地称为主串。子串的位置:子串的第一个字符在主串中的序号称为子串的位置。串相等:称两个串是相等的,是指两个串的长度相等且对应字符都相等。,2023/11/13,数据结构讲义,6,字符串的基本运算,求串长 StrLength(s)串赋值 StrAssign(s1,s2)连接操作 StrConcat(s1,s2,s)或 StrConcat(s1,s2)求子串 SubStr(s,i,len)串比较 StrCmp(s1,s2)子串
4、定位 StrIndex(s,t)串插入 StrInsert(s,i,t)串删除 StrDelete(s,i,len)串替换 StrRep(s,t,r),2023/11/13,数据结构讲义,7,4.1.2 顺序串,线性表的存储方式仍适用于串,如顺序存或链式存储,通常采用顺序存储的方法,称为顺序串。也因为字符的特殊性和字符串经常作为一个整体来处理的特点,串在存储时还有一些与一般线性表不同之处。,2023/11/13,数据结构讲义,8,1顺序存储一个字符串 通常用一组地址连续的存储单元存储串值中的字符序列,可以定长来指明最大的字符个数,也叫定长串。如:#define MAXSIZE 256 char
5、 sMAXSIZE;则字符串中的字符个数不能超过256。字符串是许多程序设计语言支持的数据类型,不同语言环境得到一个串的实际长度的方法不同,下面介绍几种标识串实际长度的方法。,类似顺序表,用一个指针来指向最后一个字符。在串尾存储一个不会在串中出现的特殊字符作为串的终结符,以此表示串的结尾。用s0存放串的实际长度,串值存放在s1sMAXSIZE,字符的序号和存储位置一致,应用更为方便。,2023/11/13,数据结构讲义,9,2 顺序串的基本运算,主要讨论定长串联接、求子串、串比较算法,顺序串的插入和删除等运算基本与顺序表相同,在此不在赘述。在下面的实现中,设串结束用0来标识。,2023/11/
6、13,数据结构讲义,10,(1)求串长算法【算法 4-1】求串s的长度 int StrLength(char s)int i=0;while(si!=0)i+;return i;,2023/11/13,数据结构讲义,11,(2)串联接【算法 4-2】两个串的连接算法int StrConcat1(char s1,char s2,char s)/*把两个串s1和s2首尾连接成一个新串s*/int i=0,j,len1,len2;len1=StrLength(s1);len2=StrLength(s2);if(len1+len2MAXSIZE1)return 0;/*MAXSIZE为 s长度,不够长
7、时*/i=0;while(s1i!=0)si=s1i;i+;j=0;while(s2j!=0)si=s2j;i+;j+;si=0;/*置串结束标志*/return 1;/*连接成功*/,2023/11/13,数据结构讲义,12,(3)求子串【算法 4-3】求子串算法int StrSub(char*t,char*s,int i,int len)/*用t返回串s中第i个字符开始的长度为len 的子串1i串长*/int slen;slen=StrLength(s);if(islen|lenslen-i+1)printf(参数不对n);return 0;for(j=0;jlen;j+)tj=si+j-
8、1;tj=0;return 1;,2023/11/13,数据结构讲义,13,(4)串比较【算法 4-4】串比较算法int StrComp(char*s1,char*s2)/*若s1=s2返回0,若s1s2返回大于0的数否则返回小于0的数*/int i=0;while(s1i=s2i,许多程序设计语言为用户提供了大量的字符串函数,如在C语言中的“string.h”库中提供了若干处理字符串的函数,通过这些函数用户很方便的构架字符串的操作,故不再这里赘述。,2023/11/13,数据结构讲义,14,4.1.3 模式匹配,串的模式匹配即子串定位是一种重要的串运算。设s和t是给定的两个串,在主串s中查找
9、子串t的过程称为模式匹配,如果在s中找到等于t的子串,则称匹配成功,函数返回t在s中的首次出现的存储位置(或序号),否则匹配失败,返回0。t也称为模式。为了运算方便,设字符串采用定长存储,且用第3种方式表示串长,即串的长度存放在0号单元,串值从1号单元存放,这样字符序号与存储位置一致。,2023/11/13,数据结构讲义,15,算法思想如下:首先将s1与t1进行比较,若不同,就将s2与t1进行比较,.,直到s的某一个字符si和t1相同,再将它们之后的字符进行比较,若也相同,则如此继续往下比较,当s的某一个字符si与t的字符tj不同时,则s返回到本趟开始字符的下一个字符,即si-j+2,t返回到
10、t1,继续开始下一趟的比较,重复上述过程。若t中的字符全部比完,则说明本趟匹配成功,本趟的起始位置是i-j+1或i-t0,否则,匹配失败。设主串s=acabaabaabcacaabc,模式t=abaabcac,匹配过程如图所示。,2023/11/13,数据结构讲义,16,【算法 4-5】简单模式匹配算法int StrIndex_BF(char s,char t)/*从串s的第一个字符开始找第一个与串t相等的子串*/int i=1,j=1;while(it0)return(i-t0);/*匹配成功,返回存储位置*/else return 0;,2023/11/13,数据结构讲义,17,下面分析它
11、的时间复杂度,设串s长度为n,串t长度为m。匹配成功的情况下,考虑两种极端情况:在最好情况下,每趟不成功的匹配都发生在第一对字符比较时:例如:s=”aaaaaaaaaabc”,t=”bc”设匹配成功发生在si处,则字符比较次数在前面i-1趟匹配中共比较了i-1次,第i趟成功的匹配共比较了m次,所以总共比较了i-1+m次,所有匹配成功的可能共有n-m+1种,设从si开始与t串匹配成功的概率为pi,等概率情况下pi=1/(n-m+1),因此最好情况下平均比较的次数是:即最好情况下的时间复杂度是O(n+m)。,2023/11/13,数据结构讲义,18,在最坏情况下,每趟不成功的匹配都发生在t的最后一
12、个字符:例如:s=”aaaaaaaaaaab”,t=”aaab”设匹配成功发生在si处,则在前面i-1趟匹配中共比较了(i-1)*m次,第i趟成功的匹配共比较了m次,所以总共比较了i*m次,因此最坏情况下平均比较的次数是:即最坏情况下的时间复杂度是O(n*m)。,2023/11/13,数据结构讲义,19,上述算法中匹配是从s串的第一个字符开始的,有时算法要求从指定位置开始,这时算法的参数表中要加一个位置参数pos:StrIndex(shar*s,int pos,char*t),比较的初始位置定位在pos处。算法4-5是pos=1的情况。,2023/11/13,数据结构讲义,20,4.2 数组
13、4.2.1 数组的逻辑结构及内存映象 4.2.2 特殊矩阵 4.2.3 稀疏矩阵,2023/11/13,数据结构讲义,21,4.2.1 数组的逻辑结构及内存映像,数组是我们熟悉的一种数据结构。数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推,所以可以看作是线性表的推广。,2023/11/13,数据结构讲义,22,1数组的逻辑结构 数组是一个具有固定格式和数量的数据有序集,每一个数据元素有唯一的一组下标来标识。在数
14、组上不能做插入、删除数据元素的操作。通常在各种高级语言中数组一旦被定义,每一维的大小及上下界都不能改变。在数组中通常做下面两种操作:(1)取值操作:给定一组下标,读其对应的数据元素。(2)赋值操作:给定一组下标,存储或修改与其相对应的数据元素。我们着重研究二维和三维数组,因为它们的应用是广泛的,尤其是二维数组。,2023/11/13,数据结构讲义,23,2 数组的内存映象,通常,数组在内存被映象为向量,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。对于一维数组按下标顺序分配即可。对多维数组分配时,要把它的元素映象存储在一维存储器中,
15、一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。,2023/11/13,数据结构讲义,24,以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,从右向左,最后是左下标。以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,从左向右,最后是右下标。,2023/11/13,
16、数据结构讲义,25,设二维数组Amn,按元素的下标求其地址的计算:以“以行为主序”的分配为例:设数组的基址为LOC(a11),每个数组元素占据l个地址单元,那么aij 的物理地址可用一线性寻址函数计算:LOC(aij)=LOC(a11)+(i-1)*n+j-1)*l 在C语言中,数组中每一维的下界定义为0,则:LOC(aij)=LOC(a00)+(i*n+j)*l 推广到一般的二维数组:Ac1.d1 c2.d2,则aij的物理地址计算函数为:LOC(aij)=LOC(a c1 c2)+(i-c1)*(d2-c2+1)+(j-c2)*l,2023/11/13,数据结构讲义,26,同理对于三维数组
17、Amnp,即mnp数组,对于数组元素aijk其物理地址为:LOC(aijk)=LOC(a111)+(i-1)*n*p+(j-1)*p+k-1)*l 推广到一般的三维数组:Ac1.d1 c2.d2 c3.d3,则aijk的物理地址为:LOC(i,j)=LOC(a c1 c2 c3)+(i-c1)*(d2-c2+1)*(d3-c3+1)+(j-c2)*(d3-c3+1)+(k-c3)*l,2023/11/13,数据结构讲义,27,三维数组的逻辑结构和以行为主序的分配示意图如图所示。,2023/11/13,数据结构讲义,28,例4-1 若矩阵Amn 中存在某个元素aij满足:aij是第i行中最小值且
18、是第j列中的最大值,则称该元素为矩阵A的一个鞍点。试编写一个算法,找出A中的所有鞍点。实现的基本思想:在矩阵A中求出每一行的最小值元素,然后判断该元素它是否是它所在列中的最大值,是则打印出,接着处理下一行。矩阵A用一个二维数组表示。,2023/11/13,数据结构讲义,29,【算法4-8】求矩阵鞍点#define M/*矩阵的行*/#define N/*矩阵的列*/void saddle(int A N)int i,j,k,p,min;for(i=0;i=M)printf(%d,%d,%dn,i,k,min);对任意mn的矩阵,算法的时间性能为O(m(n+mn)。,2023/11/13,数据结
19、构讲义,30,4.2.2 特殊矩阵,对于一个矩阵结构显然用一个二维数组来表示是非常恰当的,但在有些情况下,比如常见的一些特殊矩阵,如三角矩阵、对称矩阵、带状矩阵、稀疏矩阵等,从节约存储空间的角度考虑,这种存储是不太合适的。下面从这一角度来考虑这些特殊矩阵的存储方法。,2023/11/13,数据结构讲义,31,1.对称矩阵,对称矩阵的特点是:在一个n阶方阵中,有aij=aji,其中1i,jn,2023/11/13,数据结构讲义,32,对称矩阵关于主对角线对称,因此只需存储上三角或下三角部分即可。比如,只存储下三角中的元素aij,其特点是中ji且1in,对于上三角中的元素aij,它和对应的aji相
20、等,因此当访问的元素在上三角时,直接去访问和它对应的下三角元素即可,这样,原来需要n*n个存储单元,现在只需要n(n+1)/2个存储单元了,节约了n(n-1)/2个存储单元,当n较大时,这是可观的一部分存储资源。,2023/11/13,数据结构讲义,33,如何只存储下三角部分?对下三角部分,以行为主序顺序存储到一个向量中去,在下三角中共有n*(n+1)/2个元素,因此,不失一般性,设存储到向量SAn(n+1)/2中,存储顺序可用下图示意,这样,原矩阵下三角中的某一个元素aij则具体对应一个sak,下面的问题是要找到k与i、j之间的关系。,2023/11/13,数据结构讲义,34,在上面的排列顺
21、序中,aij是第i*(i-1)/2+j个元素,因此它在SA中的下标k与i、j的关系为:k=i*(i-1)/2+j-1(kn*(n+1)/2)当访问的元素在上三角中时(ij),因为aij=aji,因此访问和它对应的aji即可,因此将上式中的行列下标交换就是上三角中的元素aij在SA中的对应关系:k=j*(j-1)/2+i-1(kn*(n+1)/2)综上所述,对于对称矩阵中的任意元素aij,若令I=max(i,j),J=min(i,j),则将上面两个式子综合起来得到:k=I*(I-1)/2+J-1,2023/11/13,数据结构讲义,35,2.三角矩阵,形如下图的矩阵称为三角矩阵,其中c为某个常数
22、。其中(a)为下三角矩阵:主对角线以上均为同一个常数;(b)为上三角矩阵,主对角线以下均为同一个常数;下面讨论它们的压缩存储方法。,2023/11/13,数据结构讲义,36,(1)下三角矩阵 与对称矩阵类似,不同之处在于存完下三角中的元素之后,紧接着存储对角线上方的常量,因为是同一个常数,所以存一个即可,这样一共存储了n*(n+1)+1个元素,设存入向量:SAn*(n+1)+1中,这种的存储方式可节约n*(n-1)-1个存储单元,sak 与aji 的对应关系为:,2023/11/13,数据结构讲义,37,(2)上三角矩阵 对于上三角矩阵,存储思想与下三角类似,以行为主序顺序存储上三角部分,最后
23、存储对角线下方的常量。对于第1行,存储n个元素,第2行存储n-1个元素,第p行存储(n-p+1)个元素,aij的前面有i-1行,共存储:个元素,aij 是它所在的行中要存储的第(j-i+1)个也就是上三角存储顺序中的第(i-1)*(2n-i+2)/2+(j-i+1)个,因此它在SA中的下标为:k=(i-1)*(2n-i+2)/2+j-i。综上,sak 与aji 的对应关系为:,2023/11/13,数据结构讲义,38,3.带状矩阵 n阶矩阵A称为带状矩阵,如果存在最小正数m,满足当i-jm 时,aij=0,这时称w=2m-1为矩阵A的带宽。下图是一个w=3(m=2)的带状矩阵。带状矩阵也称为对
24、角矩阵。由下图可看出,在这种矩阵中,所有非零元素都集中在以主对角线为中心的带状区域中,即除了主对角线和它的上下方若干条对角线的元素外,所有其他元素都为零(或同一个常数c)。,2023/11/13,数据结构讲义,39,一种压缩方法是将A压缩到一个n行w列的二维数组B中,如下图所示,当某行非零元素的个数小于带宽w时,先存放非零元素后补零。那么aij 映射为b ij,映射关系为:,2023/11/13,数据结构讲义,40,另一种压缩方法是将带状矩阵压缩到向量C中去,按以行为主序,顺序的存储其非零元素,如下图所示,按其压缩规律,找到相应的映象函数。如当w=3时,映象函数为:k=2*i+j-3,2023
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 字符串 线性 结构 扩展

链接地址:https://www.31ppt.com/p-6564314.html