收藏 分享(赏)

数据结构-串.ppt

上传人:Facebook 文档编号:3817423 上传时间:2018-11-19 格式:PPT 页数:38 大小:449.50KB
下载 相关 举报
数据结构-串.ppt_第1页
第1页 / 共38页
数据结构-串.ppt_第2页
第2页 / 共38页
数据结构-串.ppt_第3页
第3页 / 共38页
数据结构-串.ppt_第4页
第4页 / 共38页
数据结构-串.ppt_第5页
第5页 / 共38页
点击查看更多>>
资源描述

1、Chapter 4 String,教,学,内,容,1、 串的定义 2、 串的存储表示 3、 串的模式匹配算法,4.1 串的定义,串(字符串):是由 0 个或多个字符组成的 有限序列。 记为:s =“ a1 a2 a3 ai an ” ( n0 )。,字母、数字或其他字符,必须有!,作用:避免字符串与变量名或数的常量混淆。,基本概念,例:x = “123” x = 123,test =“test”,作用:避免字符串与变量名或数的常量混淆。,空串:不含任何字符的串,长度 = 0,用符号 表示。,空格串:仅由一个或多个空格组成的串。,子串:由串中任意个连续的字符组成的子序列。,主串:包含子串的串。,

2、位置:字符在序列中的序号。 子串在主串中的位置:子串的首字符在主串中的位置。,例:S=“JINAN” S1=“” S2=“NA” S=“JINAN”, S 的子串。,S4=“JAN”, 非 S 的子串 (非串 S 中的连续字符所组成)。,在 S 中的位置:2,在 S 中的位置:0,串相等的条件:当两个串的长度相等且各个对应 位置的字符都相等时才相等。,例:S=“JINAN” S1=“JI NAN” S S1,空串是任意串的子串,任意串是其自身的子串。,串的逻辑结构:和线性表极为相似。,串的基本操作:和线性表有很大差别。,区别:串的数据对象约定是字符集。,线性表的基本操作:以“单个元素”为操作对

3、象;,串的基本操作:以“串的整体”作为操作对象。,例:在串中查找某个子串; 在串的某个位置上插入一个子串; 删除一个子串等。,串的抽象数据类型的定义,ADT String 数据对象:D ai |aiCharacterSet, i = 1, 2, ., n, n0 数据关系:R1 | ai-1, ai D, i = 2, ., n 基本操作: StrAssign (&T, chars) 初始条件:chars 是字符串常量。 操作结果:构造一个串值为 chars 的串。 StrCopy (&T, S) 初始条件:串 S 存在。 操作结果:由串 S 复制得串 T。,DestroyString (&S

4、) 初始条件:串 S 存在。 操作结果:串 S 被销毁。 StrEmpty (S) 初始条件:串 S 存在。 操作结果:若 S 为空串,则返回 TRUE, 否则返回 FALSE。 StrCompare (S, T) 初始条件:串 S 和 T 存在。 操作结果:若 S T,则返回值 0; 若 S = T,则返回值 = 0;若 S T,则返回值 0。,“串值大小” 是按 “词典次序” 进行比较的,如: StrCompare(“data”, “stru”)0,StrLength (S) 初始条件:串 S 存在。 操作结果:返回 S 的元素个数,称为串的长度。 Concat (&T, S1, S2)

5、初始条件:串 S1 和 S2 存在。 操作结果:用 T 返回由 S1 和 S2 连接而成的新串。 SubString (&Sub, S, pos, len) 初始条件:串 S 存在,0posStrLength(S)-1 且 0lenStrLength(S) pos。 操作结果:用 Sub 返回串 S 的第 pos 个字符起长度 为 len 的子串。,Index (S, T, pos) 初始条件:串 S 和 T 存在,T 是非空串, 0posStrLength(S)-1。 操作结果:若主串 S 中存在和串 T 值相同的子串, 则返回它在主串 S 中第 pos 个字符之后 第一次出现的位置;否则函

6、数值为 0。 Replace (&S, T, V) 初始条件:串 S、T 和 V 存在,T 是非空串。 操作结果:用 V 替换主串 S 中出现的所有与 T 相等 的不重叠的子串。 ADT String,假设S=“abcacabcaca”, T=“abca” , V=“ab”, 则置换之后的 S=“abcabca”, 而不是 “abbcaca”。,例如:SubString( sub, commander , 3, 3),子串为“串”中的一个字符子序列,求得 sub = man ;,SubString( sub, commander , 0, 9),SubString( sub, commande

7、r , 8, 1),求得 sub = r ,求得 sub = commander ,SubString(sub, commander, 3, 7)sub = ?,SubString(sub, beijing, 6, 2) = ?sub = ?,SubString(student, 5, 0) = ,起始位置和子串长度之间存在约束关系,长度为 0 的子串为“合法”串,假设 S = abcaabcaaabc , T = bca ,Index(S, T, 0) = 1;,Index(S, T, 3) = 5;,Index(S, T, 8) = 0;,“子串在主串中的位置”意指子串 中的第一个字符在主

8、串中的位序。,因为串是特殊的线性表,故其存储结构 与线性表的存储结构类似,只不过组成串的 结点是单个字符。,4.2.1 定长顺序存储表示,定长顺序存储表示,也称为静态存储分配 的顺序串。即用一组地址连续的存储单元依次 存放串中的字符序列。,4.2 串的存储表示,#define MAXLEN 255 class String protected:unsigned char dataMAXLEN ;int len; /串的长度public: ;,串的实际长度可在这个预定义长度的范围内随意设定,超过预定义长度的串值则被舍去,称之为“截断”。,定长顺序存储表示时串的操作的实现,1、串连接 Concat

9、(&T, S1, S2),假设串 T 是由串 S1 连结串 S2 得到的,则只要进行 相应的“串值复制”操作即可,需要时进行“截断”。,串 T 值,S1.len+S2.len MAXLEN,S1.len MAXLEN,S1.len = MAXLEN,结果正确,结果 S2 被“截断”,结果 T=S1,String / Concat,定长顺序存储表示时串操作的缺点,1、需事先预定义串的最大长度,这在程序运行前是很难估计的。,2、由于定义了串的最大长度,使得串的某些操作受限(截尾),如串的连接、插入、置换等运算。,克服办法:不限定最大长度 动态分配串值的存储空间。,4.2.2 堆分配存储表示,堆存储

10、结构的特点:仍以一组空间足够大的地址连续的存储单元依次存放串值字符序列,但它们的存储空间是在程序执行过程中动态分配的。,class String protected:char *strval;int slen; /串的长度public:String( const char *copy); ; (参考课本92页),这类串操作的实现算法为:1、为新生成的串分配一个存储空间;2、进行串值的复制。,String:String( ) / 操作结果:初始化串 slen = 0; / 串长度为0strval = NULL; / 空串 String:String( ) / 操作结果:销毁串,释放串所占用空间

11、delete strval; / 释放串strval ,String:String(const char *copy) length = strlen(copy); / 串长strVal = new charslen + 1;/ 分配存储空间 strcpy(strval, copy); / 复制串值 String:String(const String / 复制串值 ,String ,堆存储结构的优点:堆存储结构既有顺序存储结构的特点,处理(随机取子串)方便,操作中对串长又没有任何限制,更显灵活,因此在串处理的应用程序中常被采用。,堆分配存储表示为高级程序设计语言所采用。,4.2.3 串的块链

12、存储表示,串值也可用单链表存储,称为链串。 链串与单链表的差异只是它的结点数据域为单个字符。,S,优点:便于插入和删除 缺点:空间利用率低,为了提高空间利用率,可使每个结点存放多个字符 (这是顺序串和链串的综合 (折衷) ),称为块链结构。,S,存储密度 =,数据元素所占存储位,实际分配的存储位,实际应用时,可以根据问题所需来设置结点的 大小。例如:在编辑系统中,整个文本编辑区 可以看成是一个串,每一行是一个子串,构成 一个结点。即:同一行的串用定长结构(80个 字符),行和行之间用指针相连接。,4.3 串的模式匹配算法,设有主串s和子串t,子串t的定位就是要在主串s中找到一个与子串t相等的子

13、串。通常把主串s称为目标串,把子串t称为模式串,因此定位也称作模式匹配。模式匹配成功是指在目标串s中找到一个模式串t;不成功则指目标串s中不存在模式串t。,4.3.1 简单算法从目标串s=“s0s1sn-1“的第一个字符开始和模式串t=“t0t1tm-1“中的第一个字符比较,若相等,则继续逐个比较后续字符;否则从目标串s的第二个字符开始重新与模式串t的第一个字符进行比较。依次类推,若从模式串s的第i个字符开始,每个字符依次和目标串t中的对应字符相等,则匹配成功,该算法返回i;否则,匹配失败,函数返回-1。,例如,设目标串s=“cddcdc”,模式串t=“cdc”。s的长度为n(n=6),t的长

14、度为m(m=3)。用指针i指示目标串s的当前比较字符位置,用指针j指示模式串t的当前比较字符位置,匹配过程如下所示,int String:Index(const String ,算法1,int String:Index(const String /模式匹配不成功 ,算法2,4.3.2 KMP算法,KMP算法是D.E.Knuth、J.H.Morris和V.R.Pratt共同提出的,简称KMP算法。该算法较简单算法有较大改进,主要是消除了主串指针的回溯,从而使算法效率有了某种程度的提高。,例如: 设s=“abacabab“,t=“abab“,第一次匹配过程如下所示。,此时不必从i=1(i=i-j+

15、1=1),j=0重新开始第二次匹配。因t0t1,s1=t1,必有s1t0,又因t0 =t2,s2=t2,所以必有s2=t0。因此,第二次匹配可直接从i=3,j=1开始。,为此,定义nextj函数如下:max k|0kj,且“t0t1tk-1”=“tj-ktj-k+1tj-1” 当此集合非空时-1 当j=0时0 其他情况,nextj=,t=“abab”对应的next数组如下:,例: 设目标串s=“acabaabaabcacaabc”,模式串t=“abaabcac”。s的长度为17,t的长度为8。用指针i指示目标串s的当前比较字符位置,用指针j指示模式串t的当前比较字符位置。KMP模式匹配过程如下

16、所示。,int KMPIndex(String s, String t) int nextMaxSize,i=0,j=0,v;GetNext(t,next);while (i=t.slen) v=i-t.slen; /返回匹配模式串的首字符下标else v=-1; /返回不匹配标志return v; ,KMP算法,1、理解串的定长顺序存储、堆存储及链式存储各自的优缺点,能在应用中进行合理的选择。,2、掌握串的堆存储结构及其实现串的各种操作的基本方法。,教学要求,4、理解串匹配的KMP算法,熟悉NEXT函数的定义,学会手工计算给定模式串的NEXT函数值。,3、理解串匹配中简单算法的匹配过程及其具体实现。,

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

当前位置:首页 > 中等教育 > 小学课件

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


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

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

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