收藏 分享(赏)

第4章 串.ppt

上传人:scg750829 文档编号:7272852 上传时间:2019-05-12 格式:PPT 页数:36 大小:466KB
下载 相关 举报
第4章 串.ppt_第1页
第1页 / 共36页
第4章 串.ppt_第2页
第2页 / 共36页
第4章 串.ppt_第3页
第3页 / 共36页
第4章 串.ppt_第4页
第4页 / 共36页
第4章 串.ppt_第5页
第5页 / 共36页
点击查看更多>>
资源描述

1、操作受限,元素受限,内容回顾,栈,队列,线性表,后进先出,先进先出,字符集,串,第 4 章 串,计算机上的非数值处理的对象基本上是字符串数据。如:文字编辑程序,数据库管理系统,信息检索系统,检测病毒等等。,特征字符串,第 4 章 串,4.1 串类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法 4.4 串操作应用举例,重点: 串的基本概念 串的基本操作 串的存储结构,难点: 1、利用最小操作子集实现串的其它操作 2、串匹配的KMP算法,4.1 串类型的定义,串(String)是由零个或多个字符组成的有限序列。记为:s=a1a2an(n0) 基本概念 串名、串值 字符(ai) ASCI

2、I编码 是32(00100000 ); A是65 GB2312编码、Unicode编码(UTF-8) 串长度、空串、空格串 子串、主串、子串在主串中位置、串相等,4.1 串类型的定义,串的抽象数据类型,ADT String 数据对象: 数据关系: 基本操作:ADT String,D = ai | ai CharacterSet , i=1,2,.n, n=0,R1= ai-1,ai| ai D, i=2,.n。,StrAssign( ,共13项操作,其中5项操作重点掌握,串的基本操作 (1)赋值 StrAssign(&T, chars)初始条件: chars是字符串常量。操作结果: 生成一个其

3、值等于chars的串T。,4.1 串类型的定义,StrAssgin(&T,Data Structure),(2)比较 StrCompare(S, T) 初始条件: 字符串S和T存在。操作结果: 若ST,则返回值0;若S=T,则返回值=0;否则返回值0。,(3)求长度 StrLength(S)初始条件: 字符串S已经存在。操作结果: 返回串S元素个数,称为串的长度。 (4)联接 Concat(&T, S1, S2) 初始条件: 字符串S1,S2已经存在。操作结果: 用T返回由串S1和S2联接而成的新串。,StrCompare(cat,case),(5)求子串 SubString(&Sub, S,

4、 pos, len)初始条件: 串S存在,1=pos=S的长度,0=len=S的长度-pos+1。操作结果: 用Sub返回串S的第pos个字符起长度为len的子串。,Concat(&T,Data,Structure),SubString(&Sub,student,4,2),4.1 串类型的定义,串的基本操作(续),(6)复制 StrCopy(&T, S) (7)判空 StrEmpty (S) (8)清空 ClearString(&S) (9)子串在主串定位 Index(S, T, pos) (10)置换 Replace(&S, T, V),如:S=abcacabcacaT=abcaV=x 置换

5、后S=?S=xcxca V=ab置换后S=?S=abcabca,(11)插入 StrInsert(&S, pos, T) (12)删除 StrDelete(&S, pos, len) (13)销毁 DestroyString(&S),4.1 串类型的定义,例:利用串比较、求串长和求子串等基本操作,实现串的定位操作Index(S,T,pos) 。,S,T,length(S)-length(T)+1,初始条件: 串S和T存在,T是非空串,1=pos=S的长度。 操作结果: 若主串S中存在和串T相同的子串,则返回它在主串S中第pos个字符起第一次出现的位置;否则返回。,int Index(Strin

6、g S, String T, int pos) if ( pos 0 ) /pos的合法性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 / ifreturn 0; /S中不存在与T相等的子串 / Index,4.1 串类型的定义,定位操作算法描述,例:已知s=(xyz)+*,t=(x+z)*y。试利用联接( | ),求

7、子串( substr(s,i,j) )和置换( replace(s1,i,j,s2) )等基本操作,将s转换为t。,4.1 串类型的定义,s=s1|s4|s2,s1=substr(s,1,5),s1=(xyz),s2=substr(s,3,1),s3=substr(s,6,1),s4=substr(s,7,1),replace(s1,3,1,s3),s2=y,s3=+,s4=*,s1=(x+z),s=(x+z)*y,解:,4.2 串的表示和实现,定长顺序存储表示顺序映像 类型定义 #define MAXSTRLEN 255 typedef unsigned char SStringMAXSTR

8、LEN +1 约定:1)下标为0的分量存放串的长度或 2)串值后加入一个不计入串长的结束标记字符,如C语言中的0串联接Concat(&T,S1,S2) 是定长存储,联接后T的串长是S1和S2串长之和,该长度可能会超出MAXSTRLEN 分情况处理,超出部分要“截断”,Concat(&T,S1,S2)的算法示意图,串联接算法描述,Status Concat(SString / Concat,for (i=1;i=S10;i+) Ti=S1i; for (i=S10+1;i=S10+S20;i+) Ti=S2i-S10;,4.2 串的表示和实现,求子串SubString( 评价 串长超出最大长度,

9、约定采用截尾法 串长过小,则串空间浪费较大,4.2 串的表示和实现,4.2 串的表示和实现,堆分配存储表示顺序映像 类型定义 typedef structchar * ch ; / 串值所在的存储区的起始地址int length ; / 串长度 HString ; 一些操作的实现 基于复制利用malloc()分配一块足够的空间,在按要求完成复制:如StrAssign(&T,chars),Concat(&T,S1,S2),SubString(&Sub,S,pos,len),StrInsert(&S,pos,T),串的插入操作StrInsert(&S,pos,T)算法,status StrInse

10、rt(HString / StrInsert,4.2 串的表示和实现,一些操作的实现 基于链接建立串名和串值的映射关系,如:StrAssgin(&T,chars) 评价 基于动态存储管理 建立串名和串值的映射关系 处理方便,串值共享,4.2 串的表示和实现,块链存储表示链式映像 存储密度sizeof(char)sizeof(链域) -存储密度不高存储密度=串值所占的存储位/实际分配的存储位 类型定义,typedef struct Chunk / 结点结构char chCHUNKSIZE;struct Chunk *next; Chunk; typedef struct / 串的链表结构Chun

11、k *head, *tail; /串的头和尾指针int curlen; / 串的当前长度 LString;,存储密度=串值所占的存储位/实际分配的存储位,假设: 指针域 next 占16“位(bit)”,则上图中串的存储密度是多少? 存储密度= 16/(16+4*2)=16/24=2/3,4.2 串的表示和实现,4.2 串的表示和实现,存储密度的影响 存储密度小,运算处理方便,但存储占用量大 评价 存储密度较低 块链使串的操作复杂化,作业7:1利用C的库函数strlen, strcpy 和 strcat写一个算法 void StrInsert(char *S, char *T,int i) ,

12、将串T插入到S的 第i个位置上。若i大于S的长度,则插入不执行。,4.3 串的模式匹配算法,模式匹配 子串的定位操作(Index(S,T,pos)通常称为模式匹配。其中,T称为模式串。,4.3 串的模式匹配算法,4.3.1 求子串位置的定位函数 Index(S, T, pos),简单匹配算法示例:S=“ababcabcacbab” T=“abcac”,1 2 3 4 5 6 7 8 9 10 11 12 13,第一趟匹配 a b a b c a b c a c b a ba b c,第二趟匹配 a b a b c a b c a c b a ba,第六趟匹配 a b a b c a b c a

13、 c b a ba b c a c 成功!,。,int Index ( SString S , SString T, int pos ) i = pos; j = 1; while ( i S0 / Index_BF,采用定长顺序存储结构,不依赖其他串操作的匹配算法,4.3 串的模式匹配算法,简单匹配算法的复杂度分析,设 n = StrLength(S) m = StrLength(T) 最好情况S = A STRING SEARCHING EXAMPLE CONSISTING OF SIMPLE TEXT T = STING循环次数:(Index+T0-1)+4 时间复杂度:O(n+m) 最

14、坏情况 T = 00000001 S = 00000000000000000000000000000000000000000000000001循环次数:46*8时间复杂度:O(n*m),4.3 串的模式匹配算法,4.3 串的模式匹配算法,4.3.2 模式匹配的一种改进算法(KMP算法)克努特(D.E.Knuth)-莫里斯(J.H.Morris)-普拉特(V.R.Pratt)KMP算法的改进在于:每一趟匹配过程中出现字符比较不等时,不需要回朔i指针只要利用已经“部分匹配”结果,调整j指针,即将模式向右滑动尽可能远的一段距离,来个提高算法效率。,KMP算法匹配过程示意如下:1 2 3 4 5 6

15、7 8 9 0 1 2 3 第一趟匹配 a b a b c a b c a c b a b ( i = 3 )a b c ( j = 3 ) 第二趟匹配 a b a b c a b c a c b a b ( i = 3 7 )a b c a c ( j = 1 5 ) 第三趟匹配 a b a b c a b c a c b a b ( i = 7 11 )(a)b c a c ( j = 2 6 )算法复杂度为O(n+m),4.3 串的模式匹配算法,算法示例:S=“ababcabcacbab” T=“abcac”,KMP算法的基本思想(一),假设主串为 S=“s1s2.sn”,模式串为p=“

16、p1p2.pm” 要解决的问题是:当“失配”(sipj)时,模式串“向右滑动”的可行距离有多远;或者说,下一步si应该与模式串中的哪个字符比较? 可以推断:答案将完全取决于模式串,而与主串无关。因此,可以预先为模式串设定一个数组nextj,当“失配”(sipj)时,i不变,j改为nextj。 前面例子的 nextj 是:,j 1 2 3 4 5 模式串 a b c a c nextj 0 1 1 1 2,KMP算法的匹配过程示例,举例如下:1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 第一趟 a c a b a a b a a b c a c a a b c (i=2)a

17、 b (j=2,next2=1) 第二趟 a c a b a a b a a b c a c a a b c (i=2)a (j=1,next1=0) 第三趟 a c a b a a b a a b c a c a a b c (i=8)a b a a b c (j=6,next6=3) 第四趟 a c a b a a b a a b c a c a a b c (i=14)(a b)a a b c a c (j=9,成功),j 1 2 3 4 5 6 7 8 模式串 a b a a b c a c nextj 0 1 1 2 2 3 1 2,KMP算法的基本思想(一),int Index_K

18、MP ( SString S, SString T, int pos ) / 利用模式串T的next函数求T在主串 / S中第pos个字符之后第一次出现的位置;否则返回。i = pos; j = 1;while ( iT0) return i-T0; / 匹配成功else return 0; / Index_KMP,KMP算法,KMP算法的基本思想(一),KMP算法的基本思想(二),一般情况下, 模式串的next函数的定义如下:0 当j=1时 nextj= max k|1kj且“p1.pk-1”=“pj-k+1.pj-1”1 其他情况 如:,j 1 2 3 4 5 6 7 8 模式串 a b

19、a a b c a c nextj 0 1 1 2 2 3 1 2,求模式串的next值的算法思想,用递推方法求next函数值 由定义可知: next1=0, next2=1; 设nextj=k,则有关系:“p1.pk-1”=“pj-k+1.pj-1” 其中1k 使上述关系成立. 那么nextj+1 = ?,有两种情况: (1)若pk=pj,则表明: “p1.pk” = “pj-k+1.pj” 并且不可能存在 kk 使上述关系成立. 这就是说 nextj+1=k+1 或 nextj+1=nextj+1 (2)若pk pj,则表明: “p1.pk” “pj-k+1.pj” 此时求next的问题可

20、看成模式匹配的问题; 递推 k=nextk,直到pk = pj 或k=0; 此时 nextj+1=nextk+1,求模式串的next函数值,void get_next(SString T, int next) / 求模式串的T的next函数值并存入数组next.i=1; next1=0; j=0; while (iT0) if (j=0|Tj=Tj)+i;+j;nexti=j;else j = nextj; /get_next,4.4 串操作应用举例,文本编辑 处理规则:行插入/删除,页插入/删除, 数据结构:页表、行表(行号,起始地址,长度) 建立词索引表 数据结构 词表书名中的关键词集合 关键词索引表,小 结,串的两个显著特点 其一、它的数据元素都是字符 其二、串的基本操作通常以“串的整体”作为操作对象,而不像线性表是以“数据元素”作为操作对象。 串的存储结构 “串匹配”的简单算法,其算法思想直截了当,简单易懂,适用于在一般的文档编辑中应用,但在某些特殊情况,例如只有0和1两种字符构成的文本串中应用时效率就很低。 KMP算法是一种改进方法。,作业:1求模式串abaabcababb 的next值。,

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报