ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:96.88KB ,
资源ID:2808084      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/2808084.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(第4章串.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

第4章串.docx

1、第4章 串第4章 串 串(即字符串)是一种特殊的线性表,它的数据元素仅由一个字符组成,计算机非数值处理的对象经常是字符串数据,如在汇编和高级语言的编译程序中,源程序和目标程序都是字符串数据;在事物处理程序中,顾客的姓名、地址、货物的产地、名称等,一般也是作为字符串处理的。另外串还具有自身的特性,常常把一个串作为一个整体来处理,因此,在这一章我们把串作为独立结构的概念加以研究,介绍串的存储结构及基本运算。4.1 串及其基本运算4.1.1 串的基本概念串的定义串是由零个或多个任意字符组成的字符序列。一般记作:s=”a1 a2 an” (4-1)其中s 是串名;在本书中,用双引号作为串的定界符,引号

2、引起来的字符序列为串值,引号本身不属于串的内容;ai(1in)是一个任意字符,它称为串的元素,是构成串的基本单位,i是它在整个串中的序号; n为串的长度,表示串中所包含的字符个数,当n=0时,称为空串,通常记为。 几个术语子串与主串:串中任意连续的字符组成的子序列称为该串的子串。包含子串的串相应地称为主串。子串的位置:子串的第一个字符在主串中的序号称为子串的位置。串相等:是指两个串的长度相等且对应字符都相等。4.1.2 串的基本运算 串的运算有很多,下面介绍部分基本运算:StrLength(s):求串长操作结果是求出串s的长度。StrAssign(s1,s2):串赋值s1是一个串变量,s2或者

3、是一个串常量,或者是一个串变量(通常s2 是一个串常量时称为串赋值,是一个串变量称为串拷贝),操作结果是将s2的串值赋值给s1, s1原来的值被覆盖掉。StrConcat(s1,s2,s)或StrConcat(s1,s2):连接操作两个串的连接就是将一个串的串值紧接着放在另一个串的后面,连接成一个串。前者是产生新串s,s1和s2不改变; 后者是在s1的后面联接s2的串值成为s1串,s1改变, s2不改变。例如: s1=”he”,s2=” bei”,前者操作结果是s=”he bei”;后者操作结果是s1=”he bei”。SubStr(s,i,len):求子串串s存在并且1iStrLength(

4、s),0lenStrLength(s)-i+1。操作结果是求得从串s的第i个字符开始的长度为 len 的子串。len=0得到的是空串。例如:SubStr(”abcdefghi”,3,4)= ”cdef”StrCmp(s1,s2):串比较操作结果是若s1=s2,操作返回值为0;若s1s2,返回值s2,返回值0。StrIndex(s,t):子串定位s为主串,t为子串,操作结果是若ts,则操作返回t在s中首次出现的位置,否则返回值为0。如:StrIndex(”abcdebda”,”bc”)=2 StrIndex(”abcdebda”,”ba”)=0StrInsert(s,i,t):串插入串s,t存在

5、,且1iStrLength(s)+1。操作结果是将串t插入到串s 的第i个字符位置上,s的串值发生改变。StrDelete(s,i,len):串删除串s存在,并且1iStrLength(s),0lenStrLength(s)-i+1。操作结果是删除串s 中从第i个字符开始的长度为len的子串,s的串值改变。StrRep(s,t,r):串替换串s,t,r存在且t不为空,操作结果是用串r 替换串s中出现的所有与串t相等的不重叠的子串,s的串值改变。以上是串的几个基本操作。其中前个操作是最为基本的,它们不能用其他的操作来合成,因此通常将这个基本操作称为最小操作集。4.2 串的定长顺序存储及基本运算因

6、为串是数据元素类型为字符型的线性表,所以线性表的存储方式仍适用于串,也因为字符的特殊性和字符串经常作为一个整体来处理的特点,串在存储时还有一些与一般线性表不同之处。4.2.1 串的定长顺序存储类似于顺序表,用一组地址连续的存储单元存储串值中的字符序列,所谓定长是指按预定义的大小,为每一个串变量分配一个固定长度的存储区,如:#define MAXSIZE 256 char sMAXSIZE; 则串的最大长度不能超过256。 如何标识实际长度?类似顺序表,用一个指针来指向最后一个字符,这样表示的串描述如下:typedef struct char dataMAXSIZE;int curlen;Seq

7、String;SeqString s; /定义一个串变量这种存储方式可以直接得到串的长度:s.curlen+1。如图4-1所示。012345678910MAXSIZE-1abcDefghijk s.data图4-1 串的顺序存储方式1在串尾存储一个不会在串中出现的特殊字符作为串的终结符,以此表示串的结尾。比如C语言中处理定长串的方法就是这样的,它是用0来表示串的结束。这种存储方法不能直接得到串的长度,是用判断当前字符是否是0来确定串是否结束,从而求得串的长度。char sMAXSIZE;012345678910MAXSIZE-1abcdefghijk0 图4-2 串的顺序存储方式2设定长串存储

8、空间:char sMAXSIZE+1; 用s0存放串的实际长度,串值存放在s1sMAXSIZE,字符的序号和存储位置一致,应用更为方便。 4.2.2 定长顺序串的基本运算本小节主要讨论定长串联接、求子串、串比较算法,顺序串的插入和删除等运算基本与顺序表相同,在此不在赘述。串定位在下一小节讨论,设串结束用0来标识。串联接串连接是把两个串s1和s2首尾连接成一个新串s。int StrConcat1(char s1,char s2,char s)int i,j,len1,len2; i=0;len1=StrLength(s1);len2=StrLength(s2)if (len1+len2MAXSI

9、ZE-1)return 0; / s长度不够j=0;while (s1j!=0) si=s1j;i+; j+; j=0;while (s2j!=0) si=s2j;i+;j+;si=0;return 1;【算法 4-1】 串连接算法求子串int StrSub(char *t,char *s,int i,int len)/用t返回串s中第个i字符开始的长度为len 的子串1i串长int j;int slen;slen=StrLength(s);if (islen | lenslen-i+1) cout”参数不对”endl;return 0;for (j=0;jlen;j+)tj=si+j-1;t

10、j=0; return 1;【算法 4-2】 求子串算法串比较 int StrComp(char *s1,char *s2)int i=0;while (s1i=s2i & s1i!=0)i+;return (s1i-s2i);【算法 4-3】 串比较算法4.2.3 模式匹配串的模式匹配即子串定位是一种重要的串运算。设s和t是给定的两个串,在主串s中查找子串t的过程称为模式匹配,如果在s中找到等于t的子串,则称匹配成功,函数返回t在s中的首次出现的存储位置(或序号),否则匹配失败,返回0。t也称为模式。为了运算方便,设字符串采用定长存储,且用第三种方式表示串长,即串的长度存放在0号单元,串值从

11、1号单元存放,这样字符序号与存储位置一致。简单的模式匹配算法 算法思想如下:首先将s1与t1进行比较,若不同,就将s2与t1进行比较,.,直到s的某一个字符si和t1相同,再将它们之后的字符进行比较,若也相同,则如此继续往下比较,当s的某一个字符si与t的字符tj不同时,则s返回到本趟开始字符的下一个字符,即si-j+2,t返回到t1,继续开始下一趟的比较,重复上述过程。若t中的字符全部比完,则说明本趟匹配成功,本趟的起始位置是i-j+1或i-t0,否则,匹配失败。设主串s=“acabaabaabcacaabc”,模式t=“abaabcac”,匹配过程如图4-3所示。依据这个思想,算法描述如下

12、:int StrIndex_BF(char *s,char *t)/从串s的第一个字符开始找首次与串t相等的子串int i,j;i=1,j=1;while (i=s0 & jt0)return (i-t0);/匹配成功,返回存储位置elsereturn 0;【算法 4-4】 简单的模式匹配算法该算法简称为BF算法。下面分析它的时间复杂度,设串s长度为n,串t长度为m。匹配成功的情况下,考虑两种极端情况:在最好情况下,每趟不成功的匹配都发生在第一对字符比较时: 例如:s=”aaaaaaaaaabc”t=”bc”设匹配成功发生在si处,则字符比较次数在前面i-1趟匹配中共比较了i-1次,第i趟成功

13、的匹配共比较了m次,所以总共比较了i-1+m次,所有匹配成功的可能共有n-m+1种,设从si开始与t串匹配成功的概率为pi,在等概率情况下pi=1/(n-m+1),因此最好情况下平均比较的次数是: 即最好情况下的时间复杂度是O(n+m)。在最坏情况下,每趟不成功的匹配都发生在t的最后一个字符: 例如:s=”aaaaaaaaaaab”t=”aaab”设匹配成功发生在si处,则在前面i-1趟匹配中共比较了(i-1)*m次,第i趟成功的匹配共比较了m次,所以总共比较了i*m次,因此最坏好情况下平均比较的次数是: 即最坏情况下的时间复杂度是O(n*m)。上述算法中匹配是从s串的第一个字符开始的,有时算

14、法要求从指定位置开始,这时算法的参数表中要加一个位置参数pos:StrIndex(shar *s,int pos,char *t),比较的初始位置定位在pos处。算法4-4是pos=1的情况。改进后的模式匹配算法 BF算法简单但效率较低,一种对BF算法做了很大改进的模式匹配算法是克努特(Knuth)、莫里斯(Morris)和普拉特(Pratt)同时发现的,简称KMP算法。KMP算法的思想分析算法4-4的执行过程, 造成BF算法速度慢的原因是回溯,即在某趟的匹配过程失败后,对于s串要回到本趟开始字符的下一个字符,t串要回到第一个字符。而这些回溯并不是必要的。如图4-3所示的匹配过程,在第三趟匹配过程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1