已阅读5页,还剩24页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019年12月1日,1,4.1串的定义及基本运算4.2串的存储结构4.3模式匹配算法的实现4.4小结与习题,第四章串,2019年12月1日,2,串(字符串)是一种特殊的线性表,它的数据元素仅由一个字符组成,计算机非数值处理的对象经常是字符串数据,在事物处理程序中,一般也是作为字符串处理的。,4.1串的定义及基本运算,一、串和基本概念串(String)是零个或多个字符组成的有限序列。一般记作:S=“a1a2a3an”其中S是串名,双引号括起来的字符序列是串值;ai(1in)可以是字母、数字或其它字符;串中所包含的字符个数称为该串的长度。长度为零的串称为空串(EmptyString),它不包含任何字符。,2019年12月1日,3,通常将仅由一个或多个空格组成的串称为空白串(BlankString)。注意:空串和空白串的不同。,二、串的术语1.主串和子串:串中任意个连续字符组成的子序列称为该串的子串,包含子串的串相应地称为主串。通常将子串在主串中首次出现时的该子串的首字符对应的主串中的序号,定义为子串在主串中的序号(或位置)。例如,设A和B分别为A=“Thisisastring”B=“is”则B是A的子串,A为主串。,2019年12月1日,4,2.子串的位置:子串的第一个字符在主串中的序号称为子串的位置。B在A中出现了两次,首次出现所对应的主串位置是3。因此,称B在A中的序号(或位置)为3。,特别地,空串是任意串的子串,任意串是其自身的子串。,3.串相等:称两个串是相等的,是指两个串的长度相等且对应字符都相等。,2019年12月1日,5,三、串的基本运算,1.求串长StrLength(s):操作条件:串s存在;操作结果:求出串s的长度。,2.串赋值StrAssign(s1,s2)操作条件:s1是一个串变量,s2或者是一个串常量,或者是一个串变量(通常s2是一个串常量时称为串赋值,是一个串变量称为串拷贝)。操作结果:将s2的串值赋值给s1,s1原来的值被覆盖掉。,2019年12月1日,6,3.连接操作:StrConcat(s1,s2,s)或StrConcat(s1,s2)操作条件:串s1,s2存在。操作结果:两个串的联接就是将一个串的串值紧接着放在另一个串的后面,连接成一个串。前者是产生新串s,s1和s2不改变;后者是在s1的后面联接s2的串值,s1改变,s2不改变。,4.求子串SubStr(s,i,len):操作条件:串s存在,1iStrLength(s),0lenStrLength(s)-i+1。操作结果:返回从串s的第i个字符开始的长度为len的子串。len=0得到的是空串。,2019年12月1日,7,5.串比较StrCmp(s1,s2)操作条件:串s1,s2存在。操作结果:若s1=s2,操作返回值为0;若s1s2,返回值0。,6.子串定位StrIndex(s,t):找子串t在主串s中首次出现的位置操作条件:串s,t存在。操作结果:若ts,则操作返回t在s中首次出现的位置,否则返回值为-1。,2019年12月1日,8,8.串删除StrDelete(s,i,len)操作条件:串s存在,1iStrLength(s),0lenStrLength(s)-i+1。操作结果:删除串s中从第i个字符开始的长度为len的子串,s的串值改变。,7.插入StrInsert(s,i,t)操作条件:串s,t存在,1iStrLength(s)+1。操作结果:将串t插入到串s的第i个字符位置上。,9.串替换StrRep(s,t,r)操作条件:串s,t,r存在,t不为空。操作结果:用串r替换串s中出现的所有与串t相等的不重叠的子串,s的串值改变。,2019年12月1日,9,4.2串的存储结构,4.2.1串的定长顺序存储类似于顺序表,用一组地址连续的存储单元存储串值中的字符序列,所谓定长是指按预定义的大小,为每一个串变量分配一个固定长度的存储区,如:,1.类似顺序表,用一个指针来指向最后一个字符,这样表示的串描述如下:typedefstructchardataMAXSIZE;intcurlen;SeqString;,2019年12月1日,10,2.在串尾存储一个不会在串中出现的特殊字符作为串的终结符,以此表示串的结尾。比如C语言中处理定长串的方法就是这样的,它是用0来表示串的结束。,3.设定长串存储空间:charsMAXSIZE+1;用s0存放串的实际长度,串值存放在s1sMAXSIZE,字符的序号和存储位置一致,应用更为方便。,2019年12月1日,11,4.2.2定长顺序串的基本运算,1.串联接:把两个串s1和s2首尾连接成一个新串s。intStrConcat1(s1,s2,s)inti=0,j,len1,len2;len1=StrLength(s1);len2=StrLength(s2)if(len1+len2MAXSIZE-1)return0;j=0;while(s1j!=0)si=s1j;i+;j+;j=0;while(s2j!=0)si=s2j;i+;j+;si=0;return1;,2019年12月1日,12,2.求子串intStrSub(char*t,char*s,inti,intlen)intslen;slen=StrLength(s);if(islen|lenslen-i+1)printf(参数不对);return0;for(j=0;j0。,intStrComp(char*s1,char*s2)inti=0;while(s1i=s2i,2019年12月1日,14,4.2.3串的块链存储表示,顺序串上的插入和删除操作不方便,需要移动大量的字符。因此,我们可用单链表方式来存储串值,串的这种链式存储结构简称为链串。,typedefstructnodechardata;structnode*next;lstring;,一个链串由头指针唯一确定。这种结构便于进行插入和删除运算,但存储空间利用率太低。,2019年12月1日,15,为了提高存储密度,可使每个结点存放多个字符。通常将结点数据域存放的字符个数定义为结点的大小,显然,当结点大小大于1时,串的长度不一定正好是结点的整数倍,因此要用特殊字符#(#不属于串的字符集)来填充最后一个结点,以表示串的终结。,存储密度的概念:,2019年12月1日,16,4.3模式匹配算法的实现,4.3.1求子串位置的定位函数StrIndex(s,t),串的模式匹配(即子串定位)是一种重要的串运算。设s和t是给定的两个串,在串s中查找串t的位置,在此过程中称s为主串,t为子串。在主串s中查找子串t的过程称为模式匹配,如果查找成功,则称匹配成功,函数返回t在s中的首次出现的存储位置(或序号),否则匹配失败,返回-1。t也称为模式。,2019年12月1日,17,算法思想如下:首先将主串中的第一个字符s1与子串中的第一个字符t1进行比较,若相同,继续比较两个串中的第二个字符,即s2和t2进行比较,若这样的比较对于子串的每个字符都成立,则该趟比较的开始位置就是子串在主串中的位置(查找成功)若上面的比较在某个位置上出现对应位置字符不相同的情况,即此趟比较不成功,将主串的指针指向本趟比较开始位置的下一个字符(i=i-j+2),同时将子串的位置返回到第一个位置。进行下次比较,直到匹配成功或者主串已经结束。,简单的模式匹配算法BF-穷举的模式,2019年12月1日,18,算法举例,第2趟Sabbaba(i=3-j+2=2开始)Taba(j=1开始),第4趟SabbabaTaba(查找成功),第1趟Sabbaba(i=3,j=3)Taba,第3趟Sabbaba(i=2-j+2=3)开始Taba(j=1开始),主串Sabbaba(初始位置i=1,j=1)子串Taba,2019年12月1日,19,算法程序实现如下intStrIndex_BF(char*s,char*t)inti=1,j=1;while(it0)return(i-t0);/*成功,返回存储位置*/elsereturn(1);,2019年12月1日,20,算法分析-时间复杂度,(i)在最好情况下,每趟不成功的匹配都发生在第一对字符比较时例如:s=aaaaaaaaaabct=bc即最好情况下的时间复杂度是O(n+m)。,(ii)在最坏的情况下,如果不成功的匹配都发生在子串(t)的最后一个字符的位置,即每趟比较都要进行m次,这样比较的趟数要n趟,因此,此情况下的时间复杂度为O(n*m)。例如:s=aaaaaaaaaabt=aaaab,2019年12月1日,21,算法分析优点:算法简单实现容易缺点:算法复杂度高;重复比较次数比较,只要不匹配的情况,要从新开始;回溯次数比较多。,2019年12月1日,22,算法思路:如上所述,希望某趟在si和tj匹配失败后,主串指针i不回溯,模式串t向右“滑动”至某个适当位置上,使得tk对准si继续向右进行。显然,现在问题的关键是串t“滑动”到哪个位置上?不妨设位置为k,即si和tj匹配失败后,指针i不动,模式t向右“滑动”,使tk和si对准继续向右进行比较,关键的问题是确定滑动的位置。,KMP算法算法引入:分析BF算法的执行过程,造成BF算法速度慢的原因是回溯,即在某趟的匹配过程失败后,对于s串要回到本趟开始字符的下一个字符,t串要回到第一个字符。而这些回溯并不是必要的。,2019年12月1日,23,KMP算法中NEXT函数的介绍next函数的性质:nextj是一个整数,且0nextjj为了使t的右移不丢失任何匹配成功的可能,当存在多个满足上面(4)式的k值时,应取最大的,这样向右“滑动”的距离最短,“滑动”的字符为j-nextj个。如果在tj前不存在满足(4)式的子串,此时若t1tj,则k=1;若t1=tj,则k=0;这时“滑动”的最远,为j-1个字符,即用t1和sj+1继续比较。,2019年12月1日,24,NEXT函数的表示Next函数的定义:设有模式串:t=“abcaababc”,则它的next函数值为:,0当j=1maxk|1kj且t1t2tk-1=tj-k+1tj-k+2tj-11其它情况,nextj=,2019年12月1日,25,KMP算法程序实现如下:intStrIndex_KMP(char*s,char*t,intpos)/*从串s的第pos个字符开始找首次与串t相等的子串*/inti=pos,j=1,slen,tlen;while(it0)returni-t0;/*匹配成功,返回位置*/elsereturn1;/*匹配不成功,返回信息*/,2019年12月1日,26,Next函数的求法:据前述,可把求next函数值的问题看成是一个模式匹配问题,整个模式串既是主串又是模式,而当前在匹配的过程中,已有上面的(5)式成立,则当tktj时应将模式向右滑动,使得第nextk个字符和“主串”中的第j个字符相比较。若nextk=k,且tktj,则说明在主串中第j+1个字符之前存在一个最大长度为k的子串,使得t1t2tk=tj-k+1tj-k+2tj(6)因此:nextj+1=nextk+1(7),2019年12月1日,27,同理若tktj,则将模式继续向右滑动至使第nextk个字符和tj对齐,依此类推,直至tj和模式中的某个字符匹配成功或者不存在任何k(1kkj)满足(4.10),此时若t1tj+1,则有:nextj+1=1(8)否则若t1=tj+1,则有:nextj+1=0(9),2019年12月1日,28,求Next函数的程序实现:voidGetNext(char*t,intnext)inti=1,j=0;next1=0;while(i0,2019年12月1日,
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 夫妻扶养协议书模板
- 2026-2031中国除草剂行业前景研究与战略咨询报告(定制版)
- 2026-2031中国光伏产业市场前景及投资研究报告
- 2026-2031中国功率半导体市场研究及发展趋势预测
- 2025年健康管理师综合素养考试试题及答案解析
- 2025年反诈骗知识竞赛问答试题及答案
- 小学人教版 (PEP)Unit 5 Do you like pears Part B教学设计
- 2025年公文写作能力试题及答案
- 2026-2031中国女休闲装行业市场前景分析预测报告
- 2026年校车安全管理合同
- 关于中药学大专毕业论文范文
- 中国脑出血诊治指南
- 纺织概论全套-课件
- 衰老肌肤护理方案
- DB3301-T 0450-2024 限额以下工程建设项目交易管理规范
- 高校实验室安全基础学习通超星期末考试答案章节答案2024年
- GB/T 3830-2024软聚氯乙烯压延薄膜和片材
- TCI 368-2024 供电服务客服调度管理规范
- 2023-2024学年全国小学六年级上英语人教版期中试卷(含答案解析)
- 解读心肺复苏专家共识课件
- 明清古家具鉴赏 知到智慧树网课答案
评论
0/150
提交评论