第4章-算法数据结构课件.ppt
- 【下载声明】
1. 本站全部试题类文档,若标题没写含答案,则无答案;标题注明含答案的文档,主观题也可能无答案。请谨慎下单,一旦售出,不予退换。
2. 本站全部PPT文档均不含视频和音频,PPT中出现的音频或视频标识(或文字)仅表示流程,实际无音频或视频文件。请谨慎下单,一旦售出,不予退换。
3. 本页资料《第4章-算法数据结构课件.ppt》由用户(三亚风情)主动上传,其收益全归该用户。163文库仅提供信息存储空间,仅对该用户上传内容的表现方式做保护处理,对上传内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知163文库(点击联系客服),我们立即给予删除!
4. 请根据预览情况,自愿下载本文。本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
5. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007及以上版本和PDF阅读器,压缩文件请下载最新的WinRAR软件解压。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 数据结构 课件
- 资源描述:
-
1、第第4 4章章 串串字符串一般简称串字符串一般简称串【学习目标】【学习目标】1. 1. 理解理解“串串”类型定义中各基本操作的特点,并能正确类型定义中各基本操作的特点,并能正确利用它们进行串的其它操作。利用它们进行串的其它操作。2. 2. 理解串类型的各种存储表示方法。理解串类型的各种存储表示方法。3. 3. 理解串匹配的各种算法。理解串匹配的各种算法。【重点和难点】【重点和难点】相对于其它各个知识点而言,本章非整个课程的重点,相对于其它各个知识点而言,本章非整个课程的重点,鉴于串已是多数高级语言中已经实现的数据类型,因此本鉴于串已是多数高级语言中已经实现的数据类型,因此本章重点仅在于了解串类
2、型定义中各基本操作的定义以及串章重点仅在于了解串类型定义中各基本操作的定义以及串的实现方法,并学会利用这些基本操作来实现串的其它操的实现方法,并学会利用这些基本操作来实现串的其它操作。本章的难点是理解实现串匹配的作。本章的难点是理解实现串匹配的KMP算法的思想,但算法的思想,但它不属本章学习的基本要求,更不是重点学习内容。它不属本章学习的基本要求,更不是重点学习内容。为何要单独讨论为何要单独讨论“串串”类型?类型?1 1) 程序设计中,处理对象很多都是串类型。程序设计中,处理对象很多都是串类型。2 2) 字符串操作比其他数据类型更复杂(如拷贝、字符串操作比其他数据类型更复杂(如拷贝、连接操作)
3、。连接操作)。 4.1 4.1 串类型的定义串类型的定义 4.2 4.2 串的表示和实串的表示和实现现 4.3 4.3 串的模式匹配算法串的模式匹配算法4.1 4.1 串类型的定义串类型的定义4.1 4.1 串类型定义串类型定义 串串( (string)string): :即字符串,是由零个或多个字符即字符串,是由零个或多个字符组成的组成的有限序列有限序列。 是是数据元素为单个字符数据元素为单个字符的特殊线性表。的特殊线性表。记为:记为: s = a1 a2 . an (n0 ) 串名串名串值(用串值(用 括起来)括起来) ai( 0i n)可以是字母、数字或其它字符;可以是字母、数字或其它字
4、符;4.1 4.1 串类型定义串类型定义长度:长度:串中字符数目串中字符数目 n n 称为串的称为串的长度长度。空串:空串:长度为长度为 0 的字符称为的字符称为空串空串(Null string), 我们用我们用表示表示“空串空串”。空格串:空格串:由一个或多个空格组成的串由一个或多个空格组成的串 称称为为空格串空格串(black string)。 问:空串和空格串有无区别?问:空串和空格串有无区别?答:答:有区别有区别。空串空串( (Null String) )是指长度为零的串;是指长度为零的串;而空格串而空格串( (Blank String),),是指包含一个或多个空格字是指包含一个或多个
5、空格字符符 ( (空格键空格键) )的字符串。它的长度为空格字符的个数的字符串。它的长度为空格字符的个数空串是任意串的子串;任意串空串是任意串的子串;任意串S S都是自身的子串,都是自身的子串,除除S S本身外,本身外,S S的其它子串称为的其它子串称为“真子串真子串”4.1 4.1 串类型定义串类型定义子串子串:串:串 S 中任意个连续的字符组成的子序列叫中任意个连续的字符组成的子序列叫 S S 的子串的子串; ;主串主串:包含子串的串:包含子串的串 S 叫叫主串主串。字符位置字符位置:字符在串中的序号。:字符在串中的序号。子串位置子串位置:子串的第一个字符在主串中的序号。:子串的第一个字符
6、在主串中的序号。串相等串相等:串长度相等,且对应位置上字符相等。:串长度相等,且对应位置上字符相等。例例1 1:现有以下:现有以下4 4个字符串:个字符串:a =BEI b =JING c = BEIJING d = BEI JING问:问: 他们各自的长度?他们各自的长度? a是哪个串的子串?在主串中的位置是多少?是哪个串的子串?在主串中的位置是多少? 空串是哪个串的子串?空串是哪个串的子串? a a是不是自己的子串?是不是自己的子串?a =3,b =4,c = 7,d=8a是是c和和d的子串,在的子串,在c和和d中的位置都是中的位置都是1 1C C语言中已有类似串运算函数语言中已有类似串运
7、算函数 串的抽象数据类型定义串的抽象数据类型定义ADT String 数据对象数据对象: D ai |aiCharacterSet, i=1,2,.,n, n0 数据关系数据关系: R1 | ai-1, ai D, i=2,.,n 基本操作基本操作: (教材(教材p71给出给出1313种基本操作种基本操作) StrAssign(&T, chars) / 串赋值,生成值为串赋值,生成值为charschars的串的串T T StrCompare(S,T) / 串比较,若串比较,若STST,返回值大于返回值大于0 0 StrLength(S) / 求串长,即返回求串长,即返回S S的元素个数的元素个
8、数 Concat(&T, S1, S2) / 串连接,用串连接,用T T返回返回S1S1S2S2的新串的新串 SubString(&Sub, S, pos, len) / 求求S S中中pospos起长度为起长度为lenlen的子串的子串 Index(S, T, pos) / 返回子串返回子串T T在在pospos之后的位置之后的位置 Replace(&S, T,V) / 用子串用子串V V替换子串替换子串T T4.1 4.1 串类型定义串类型定义注:注:ConcatConcat操作操作concatenationconcatenation,把多个短字符串合并为长字符串把多个短字符串合并为长字符
9、串 复习:复习:C语言中常用的串运算语言中常用的串运算4.1 4.1 串类型定义串类型定义注:用注:用C C处理字符串时,要调用标准库函数处理字符串时,要调用标准库函数 #include串比较串比较:int strcmp(char *s1,char *s2); / StrCompare(S,T) 求串长:求串长:int strlen(char *s); /StrLength(S) 串连接:串连接:char strcat(char *to,char *from) / Concat(&T, S1, S2) 子串子串T T定位:定位:char strchr(char *s,char *c); / I
10、ndex(S, T, pos) 4.1 4.1 串类型定义串类型定义 可利用可利用串比较串比较、求串长和求子串等操作实现定、求串长和求子串等操作实现定位函数实现位函数实现Index(S,T,pos)算法的基本思想为:算法的基本思想为:StrCompare(SubString(S, i, StrLength(T), T ) S 串串 T 串串 T 串串iposn-m+1n= StrLength(S) m= StrLength(T)4.1 4.1 串类型定义串类型定义算法描述:算法描述:int Index (String S, String T, int pos) / / T为非空串。若主串为非空
11、串。若主串S中第中第pos个字符之后存在与个字符之后存在与T T相等的子串,相等的子串,/ / 则返回第一个这样的子串在则返回第一个这样的子串在S S中的中的 位置,否则返回位置,否则返回0 0 if (pos 0) n = StrLength(S); m = StrLength(T); i = pos; while ( i = n-m+1) SubString (sub, S, i, m); if (StrCompare(sub,T) != 0) +i ; else return i ; / while / if return 0; / S中不存在与中不存在与T相等的子串相等的子串 / In
12、dexIndex(S, T, pos) / / 返回返回子串子串T T在主串在主串S S中第中第pospos之之后第一次出现的位置后第一次出现的位置 例例1 1:设设 s=I AM A STUDENT,t=GOOD,q=WORKER。求:求: StrLength(s) StrLength(t) SubString(&sub, s, 8, 7)= SubString(&sub, t, 2, 1)= Index(s, A)= Index(s, t)= Replace( &s, STUDENT, q )=4.1 4.1 串类型定义串类型定义14 4STUDENTO30I AM A WORKER思考:
13、思考:SubString(&sub, q, 5, 0)= 长度为长度为 0 的子串为的子串为“合法合法”串串4.1 4.1 串类型定义串类型定义 例例2 2:设设 s =I AM A STUDENT, t =GOOD,求:求: Concat( SubString(s,6,2), Concat( t,SubString(s,7,8) ) ) ?解:因为解:因为SubString(s,6,2)A ;SubString(s,7,8) STUDENTConcat(t,SubString(s,7,8)GOOD STUDENT所以:所以:Concat(SubString(s,6,2), Concat(t,
14、SubString(s,7,8)A GOOD STUDENT 4.2 4.2 串的表示和实现串的表示和实现4.24.2 串的表示和实现串的表示和实现 串串的逻辑结构和的逻辑结构和线性表线性表极为相似,极为相似,区别区别仅在于仅在于串的串的数据对象约束为字符集。数据对象约束为字符集。 串的基本操作和线性表有很大差别。串的基本操作和线性表有很大差别。 在线性表的基本操作中,大多以在线性表的基本操作中,大多以“单个元素单个元素”作为操作对作为操作对象;象; 在串的基本操作中,通常以在串的基本操作中,通常以“串的整体串的整体”作为操作对象。作为操作对象。例如查找某子串,在主串某位置上插入一个子串等。例
15、如查找某子串,在主串某位置上插入一个子串等。4.24.2 串的表示和实现串的表示和实现 4.2.1 4.2.1 定长顺序存储表示定长顺序存储表示用一组地址连续的存储单元来存放串值的字符序列。用一组地址连续的存储单元来存放串值的字符序列。为每个定义的变量分配为每个定义的变量分配固定长度固定长度存储区存储区#define MAXSTRLEN 255 / 用户可在用户可在255以内定义最大串长以内定义最大串长 typedef unsigned char Sstring MAXSTRLEN + 1; / 0号单元存放串的长度号单元存放串的长度4.24.2 串的表示和实现串的表示和实现如:如:SStri
16、ngSString x; x; x x是有是有256256个字符型变量的数组个字符型变量的数组 x0=5,x1=a, 5 a H c d B . 串的实际长度可在这个予定义长度的范围内随意设定,超过串的实际长度可在这个予定义长度的范围内随意设定,超过予定义长度的串值则被舍去,称之为予定义长度的串值则被舍去,称之为“截断截断” 4.2.1 4.2.1 定长顺序存储表示定长顺序存储表示1.串联接串联接Concat(&T,s1,s2)4.24.2 串的表示和实现串的表示和实现串的联接算法中需分三种情况处理串的联接算法中需分三种情况处理S10+S20MAXSTRLENS10 MAXSTRLEN, S1
17、0+ S20MAXSTRLENS10= MAXSTRLENS1 sm s1 s2 S2 tn t1 t2 T sm+tn s1 s2 t1 t2 T1.S10 = S11.S10;TS10+1.MAXSTRLEN = S21.MAXSTRLENS10;T0 = MAXSTRLEN; uncut = FALSE; 4.24.2 串的表示和实现串的表示和实现 Status Concat(SString S1, SString S2, SString &T) / 用用T返回由返回由S1和和S2联接而成的新串。若未截断联接而成的新串。若未截断, 则返回则返回TRUE, /否则否则FALSE。 retu
18、rn uncut; / Concat T1.S10 = S11.S10; TS10+1.S10+S20 = S21.S20; T0 = S10+S20; uncut = TRUE; if (S10+S20 = MAXSTRLEN) / 未截断 else if (S10 MAXSTRSIZE) / 截断 else / 截断(仅取S1) T0.MAXSTRLEN = S10.MAXSTRLEN; / T0 = S10 = MAXSTRLEN uncut = FALSE; 4.2.1 4.2.1 定长顺序存储表示定长顺序存储表示2.求子串求子串SubString(&Sub,S,pos,len)4.2
19、4.2 串的表示和实现串的表示和实现将串将串S S中从第中从第pospos个字符开始、长度为个字符开始、长度为lenlen的字符序列复制到串的字符序列复制到串SubSub中中( (注:串注:串SubSub的预留长度与的预留长度与S S一样一样) )s = a1 a2 . anposlenSub 讨论:在操作中出现串值序列长度超过上界讨论:在操作中出现串值序列长度超过上界MAXSIZE时,约定截尾法处理。若想存放时,约定截尾法处理。若想存放超长超长字符串怎么办?字符串怎么办?改用改用动态分配动态分配的一维数组的一维数组堆堆 4.2.1 4.2.1 定长顺序存储表示定长顺序存储表示2.求子串求子串
20、SubString(&Sub,S,pos,len)算法描述:算法描述:Status SubString(SString &sub, SString S, int pos, int len ) if(posS0 | lenS0-pos+1) return ERROR; /若若pospos和和lenlen参数越界,则告警参数越界,则告警 Sub1len=Spospos+len-1; Sub0=len; return OK;/4.24.2 串的表示和实现串的表示和实现子串长度子串长度4.24.2 串的表示和实现串的表示和实现 4.2.2 4.2.2 堆分配存储表示堆分配存储表示仍用一组连续的存储单元
21、来存放串,但存储空间是在程仍用一组连续的存储单元来存放串,但存储空间是在程序执行过程中序执行过程中动态分配动态分配而得。而得。通常,通常,C C语言中存在一个称之为语言中存在一个称之为“堆堆”的自由存储空间。提供的自由存储空间。提供的串类型就是以这种存储方式实现的。系统利用函数的串类型就是以这种存储方式实现的。系统利用函数malloc( )和和free( )进行串值空间的进行串值空间的动态管理。动态管理。/=串的堆分配存储表示串的堆分配存储表示=typedef struct char *ch; / 若是非空串若是非空串,则按串实际长度分则按串实际长度分 /配存储区配存储区;否则否则 ch为为N
22、ULL int length; / 串长度串长度 HString; 301 11 A b c d e 1 2 w r A B 301x.ch x.length4.24.2 串的表示和实现串的表示和实现 4.2.2 4.2.2 堆分配存储表示堆分配存储表示串插入操作:串插入操作:void StrInsert (HString& S, int pos, HString T) / 1posStrLength(S)1。在串在串 S S 的第的第 pos pos 个字符之前插入串个字符之前插入串 T Tif (posS.length+1) return ERROR; /pospos不合法则告警不合法则告
23、警 if(T.length) /只要串只要串T T不空,就需要重新分配不空,就需要重新分配S S空间,以便插入空间,以便插入T T if (!(S.ch=(char*)realloc(S.ch, (S.length+T.length)*sizeof(char) ) exit(OVERFLOW); for ( i=S.length-1; i=pos-1; -i ) /为插入为插入T T而腾出而腾出pospos之后的位置之后的位置 S.chi+T.length = S.chi; /从从S S的的pospos位置起全部字符均后移位置起全部字符均后移 S.chpos-1pos+T.length-2 =
24、 T.ch0T.length-1; /插入插入T T S.length + = T.length; /刷新刷新S S串长度串长度 / StrInsert _HSqC C是指针变量,可以是指针变量,可以自增!意即每次后自增!意即每次后移一个数据单元。移一个数据单元。4.24.2 串的表示和实现串的表示和实现 4.2.2 4.2.2 堆分配存储表示堆分配存储表示Status StrAssign(HString &T, char *chars) /生成一个串长量生成一个串长量chars的串的串T if (T.ch) free(T.ch); /释放释放T原有空间原有空间 for (i=0, c=cha
展开阅读全文