串类型的定义串的示和实现串的模式匹配算法_第1页
串类型的定义串的示和实现串的模式匹配算法_第2页
串类型的定义串的示和实现串的模式匹配算法_第3页
串类型的定义串的示和实现串的模式匹配算法_第4页
串类型的定义串的示和实现串的模式匹配算法_第5页
已阅读5页,还剩36页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、1 4.1 串类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法 2 第第4 4章章 串串重点: (1)adt串的设计、实现方法和基本操作;(2)串的简单模式匹配算法,kmp算法。 难点:串的模式匹配算法中的kmp算法。 本章重点难点3 4.1 串类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法 4 第第4 4章章 串串4.1 串类型的定义串类型的定义 串是由零个或多个字符组成的有限序列。 记为:s=”a1a2an” (n0) 其中,s是串的名,用双引号括起来的字符序列是串的值。 (1) 串的长度:串中字符的数目n。 (2) 空串(null string):长度为零的串。

2、 (3) 子串:串中任意个连续的字符组成的子序列。p 串的有关术语p 串(string)的定义 5 第第4 4章章 串串4.1 串类型的定义串类型的定义 (4) 主串 包含子串的串相应地称为主串。 (5) 串相等 只有当两个串的长度相等,并且各个对应位置的字符都相等,称两串相等。 (6) 空格串(空白串)(blank string) 由一个或多个空格组成的串。要和“空串”区别,空格串有长度就是空格的个数。p 串的有关术语 6 第第4 4章章 串串4.1 串类型的定义串类型的定义 (1) 串数据对象约束为字符集。 (2) 基本操作的对象不同,线性表以“单个元素”为操作对象;串以“串的整体”为操作

3、对象,操作的一般都是子串。p 串与一般线性表的区别 7 第第4 4章章 串串adt string 数据对象数据对象: 数据关系数据关系: 基本操作:基本操作: adt string p 串的adt定义见下页见下页d ai |aicharacterset,i=1,2,.,n, n0 r1 | ai-1, ai d, i=2,.,n 4.1 串类型的定义串类型的定义 8 第第4 4章章 串串p 基本操作: strassign (&t, chars) /根据串常量根据串常量chars生成串生成串t strcopy (&t, s) /把串把串s中内容拷贝到中内容拷贝到t串串 destr

4、oystring(&s) /销毁串销毁串s strempty (s) /判断串是否空判断串是否空 strcompare (s, t) /比较串比较串s和和t strlength(s) /求串长求串长 concat (&t, s1, s2) /连接串连接串4.1 串类型的定义串类型的定义 9 第第4 4章章 串串p 基本操作: substring (&sub, s, pos, len) /求子串求子串 index (s, t, pos) /子串定位子串定位 clearstring (&s) /清空串清空串s strdelete (&s, pos, len)

5、 /删除子串删除子串 replace (&s, t, v) /把串把串s中符合中符合t的子串替换的子串替换 strinsert (&s, pos, t) /插入子串插入子串4.1 串类型的定义串类型的定义 10 第第4 4章章 串串4.2 串的表示和实现4.2.1、定长顺序存储表示4.2.2、堆分配存储表示4.2.3、串的块链存储表示 11 第第4 4章章 串串4.2.1 定长顺序存储表示定长顺序存储表示 #define maxstrlen 255 / 用户可在用户可在255以内定义最大串长以内定义最大串长 typedef unsigned char sstringmaxstr

6、len+1; / 0号单元存放串的长度号单元存放串的长度sstring s;p 串的顺序存储c语言实现 12 第第4 4章章 串串 status concat(sstring s1, sstring s2, sstring &t) / 用用t返回由返回由s1和和s2联接而成的新串。若未截断联接而成的新串。若未截断, 则返回则返回true,否则,否则false。 . return uncut; / concat t1.s10 = s11.s10; ts10+1s10+s20 = s21s20; t0 = s10+s20; uncut = true; if (s10+s20 = maxst

7、rlen) / 未截断未截断4.2.1 定长顺序存储表示定长顺序存储表示p 串的连接算法 13 第第4 4章章 串串 status concat(sstring s1, sstring s2, sstring &t) / 用用t返回由返回由s1和和s2联接而成的新串。若未截断联接而成的新串。若未截断, 则返回则返回true,否则,否则false。 . return uncut; / concat else if (s10 maxstrsize) / 截断截断t1.s10 = s11.s10;ts10+1maxstrlen = s21maxstrlens10;t0 = maxstrlen

8、; uncut = false; 4.2.1 定长顺序存储表示定长顺序存储表示p 串的连接算法 14 第第4 4章章 串串 status concat(sstring s1, sstring s2, sstring &t) / 用用t返回由返回由s1和和s2联接而成的新串。若未截断联接而成的新串。若未截断, 则返回则返回true,否则,否则false。 . return uncut; / concat else / 截断截断(仅取仅取s1) t0.maxstrlen = s10.maxstrlen; / t0 = s10 = maxstrlen uncut = false; 4.2.1

9、 定长顺序存储表示定长顺序存储表示p 串的连接算法 15 第第4 4章章 串串 status strdelete (ssstring &s, int pos, int len) if (poss0|len=s0) s0=pos-1; else for(i=pos+len;i=s0;i+) si-len=si; s0=s0-len; return ok;4.2.1 定长顺序存储表示定长顺序存储表示p 子串的删除算法 16 第第4 4章章 串串4.2 串的表示和实现4.2.1、定长顺序存储表示4.2.2、堆分配存储表示4.2.3、串的块链存储表示 17 第第4 4章章 串串4.2.2 堆分

10、配存储表示堆分配存储表示 typedef struct char *ch; / 若是非空串,则按串长分配存储区,若是非空串,则按串长分配存储区, / 否则否则ch为为null int length; / 串长度串长度 hstring;p 堆分配存储表示的c语言实现 18 第第4 4章章 串串status concat(hstring &t, hstring s1, hstring s2) / 用用t返回由返回由s1和和s2联接而成的新串联接而成的新串 if (t.ch) free(t.ch); / 释放旧空间释放旧空间 if (!(t.ch = (char *) malloc(s1.l

11、ength+s2.length)*sizeof(char) exit (overflow); t.ch0.s1.length-1 = s1.ch0.s1.length-1; t.length = s1.length + s2.length; t.chs1.lengtht.length-1 = s2.ch0.s2.length-1;return ok; / concat4.2.2 堆分配存储表示堆分配存储表示p 堆分配存储表示的串连接算法 19 第第4 4章章 串串 status substring(hstring &sub, hstring s, int pos, int len) i

12、f (pos s.length | len s.length-pos+1) return error; if (sub.ch) free (sub.ch); / 释放旧空间释放旧空间 if (!len) sub.ch = null; sub.length = 0; / 空子串空子串 else . / 完整子串完整子串 return ok; / substring4.2.2 堆分配存储表示堆分配存储表示p 堆分配存储表示的求子串算法 20 第第4 4章章 串串 sub.ch = (char *)malloc(len*sizeof(char); sub.ch0.len-1 = spos-1.pos

13、+len-2; sub.length = len;4.2.2 堆分配存储表示堆分配存储表示p 堆分配存储表示的求子串算法接上页接上页 21 第第4 4章章 串串4.2.3 串的块链存储表示串的块链存储表示字符串本身就是一个线性表,可以用链表存储。存储密度存储密度 = 数据元素所占存储位数据元素所占存储位实际分配的存储位实际分配的存储位存储密度存储密度 = 840=20% p 链表存储字符串的讨论如果每个结点存储一个字符,如采用32位地址,字符按8位记,则存储密度是多少? 22 第第4 4章章 串串4.2.3 串的块链存储表示串的块链存储表示结论:采用普通链表存储字符串,存储密度非常低,浪费空间

14、严重。p 链表存储字符串的讨论解决办法:一个结点存储多个字符。这就是串的块链存储。 23 第第4 4章章 串串 #define chunksize 80 typedef struct chunk / 结点结构结点结构 char chcunksize; struct chunk *next; chunk; typedef struct / 串的链表结构串的链表结构 chunk *head, *tail; / 串的头和尾指针串的头和尾指针 int curlen; / 串的当前长度串的当前长度 lstring;4.2.3 串的块链存储表示串的块链存储表示p 串的块链存储的c语言实现 24 第第4 4

15、章章 串串4.3 串的模式匹配算法4.3.1 模式匹配简单算法4.3.2 模式匹配kmp算法 25 第第4 4章章 串串4.3 串的模式匹配算法串的模式匹配算法初始条件:串s和t存在,t是非空串, 1posstrlength(s)。index (s, t, pos)p 串匹配(查找)的定义操作结果:若主串s中存在和串t值相同的子串返回它在主串s中第pos个字符之后第一次出现的位置;否则函数值为0。 26 第第4 4章章 串串4.3.1 模式匹配简单算法int index(sstring s, sstring t, int pos) i = pos; j = 1; while (i = s0 &

16、amp; j t0) return i-t0; else return 0; / index 27 第第4 4章章 串串 讨论下面这种情况的时间复杂性,设s串长为n,t串长为m。 s:a b c d e f g h j k l l k c d e t:j k l4.3.1 模式匹配简单算法模式匹配简单算法p 时间复杂性分析 假设从第i个位置匹配成功,前i-1次共比较了i-1次。 第i次比较了m次,共比较了i+m-1次。 i从1到n-m+1,共(n+m)(n-m+1)/2 平均需比较(n+m)/2 最好的情况平均时间复杂度为o(n+m) 28 第第4 4章章 串串 讨论下面这种情况的时间复杂性,

17、设s串长为n,t串长为m。 s:0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 t:0 0 0 0 0 0 14.3.1 模式匹配简单算法模式匹配简单算法 若第i趟比较成功,共比较了多少次? 前i-1趟比较每次都比较m次,第i趟也比较m次 共im次, i从1到n-m+1 共比较了(n-m+2)(n-m+1)m/2 平均比较次数(n-m+2)m/2 最坏的情况时间复杂度为o(n m)p 时间复杂性分析 29 第第4 4章章 串串4.3 串的模式匹配算法4.3.1 模式匹配简单算法4.3.2 模式匹配kmp算法 30 第第4 4章章 串串主串s:子串t:4.3.1 模式

18、匹配模式匹配kmp算法算法a b c d c c d d e例例a b c d e1 2 3 4 5 6 7 8 9ij下图中主串游标i指向5,子串中游标j指向5,按照简单模式匹配算法两处不相等时j回到1,i回到2,继续比较,分析在这种情况下,这样做有没有意义?结论:没有意义。p 事例讨论 31 第第4 4章章 串串主串s:子串t:4.3.1 模式匹配模式匹配kmp算法算法a b c d a b c d a b c f ea b c d a b c f1 2 3 4 5 6 7 8 9ij结论:j回到1,i回到2没有意义。例例下图中主串游标i指向8,子串中游标j指向8,按照简单模式匹配算法两处

19、不相等时j回到1,i回到2,继续比较,分析在这种情况下,这样做有没有意义?在什么情况下才有意义?p 事例讨论 32 第第4 4章章 串串主串s:子串t:4.3.1 模式匹配模式匹配kmp算法算法a b c d a b c d a b c f ea b c d a b c f1 2 3 4 5 6 7 8 9ijp 事例讨论结论:只有i回到5,j回到1才有意义。如下图。主串s:子串t:a b c d a b c d a b c f ea b c d a b c f1 2 3 4 5 6 7 8 9ij与原来的比较图进行对比,看有什么发现? 33 第第4 4章章 串串主串主串s:子串子串t:4.3

20、.1 模式匹配模式匹配kmp算法算法a b c d a b c d a b c f ea b c d a b c f1 2 3 4 5 6 7 8 9ijp 事例讨论结论:可以i不动,j回到4。如下图。p kmp算法的思想主串指针不回溯,模式串向后滑动至某个位置上。 34 第第4 4章章 串串主串s:子串t:4.3.1 模式匹配模式匹配kmp算法算法a b c d a b c d a b c f ea b c d a b c f1 2 3 4 5 6 7 8 9ijp 子串游标滑动到k必须满足的条件结论:可以i不动,j回到4。如下图。与原来的比较图进行对比,看有什么发现?a b c d a b

21、 c fj 35 第第4 4章章 串串假如j滑动到k,如果比较有意义:必须满足: “t1t2tk-1” = “si-k+1si-k+2si-1” “tj-k+1tj-k+2tj-1” = “si-k+1si-k+2si-1”(部分匹配) “t1t2tk-1” = “tj-k+1tj-k+2tj-1” (真子串)主串主串s:si-j si-j+1 si-j+2 si-2 si-1si si+1子串子串t: t1 t2 tj-2 tj-1 tj4.3.1 模式匹配模式匹配kmp算法算法p 子串游标滑动到k必须满足的条件 36 第第4 4章章 串串 max k|1kj,且且“t1tk-1”=“tj-

22、k+1tj-1” 当此集合非空时当此集合非空时 0 0 当当j=1j=1时时 1 1 其他情况其他情况nextj=表明当模式中第j个字符与主串中相应字符“失配”时,在模式中需重新和主串中该字符进行比较的字符的位置。4.3.1 模式匹配模式匹配kmp算法算法p nextj函数 37 第第4 4章章 串串int index_kmp (sstring s,sstring t, int pos) i= pos,j =1; while (i=s0 & jt0) return i-t0; /匹配成功匹配成功 else return 0; /返回不匹配标志返回不匹配标志 4.3.1 模式匹配模式匹配kmp算法算法p kmp算法 38 第第4 4章章 串串(1) next1 = 0;表明主串从下一字符表明主串从下一字

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论