1、数据结构计算机与信息学院 刘勇每课一贴:一个人去买鹦鹉,看到一只鹦鹉前标:此鹦鹉会两门语言,售价二百元。另一只鹦鹉前则标有:此鹦鹉会四门语言,售价四百元。该买哪只呢?两只都毛色光鲜,非常灵活可爱。这人转啊转,拿不定主意。结果突然发现一只老掉了牙的鹦鹉,毛色暗淡散乱,标价八百元。这人赶紧将老板叫来:这只鹦鹉是不是会说八门语言?店主说:不。这人奇怪了:那为什么又老又丑,又没有能力,会值这个数呢?店主回答:因为另外两只鹦鹉叫这只鹦鹉老板。这故事告诉我们,真正的领导人,不一定自己能力有多强,只要懂信任,懂放权,懂珍惜,就能团结比自己更强的力量,从而提升自己的身价。相反许多能力非常强的人却因为过于完美主
2、义,事必躬亲,什么人都不如自己,最后只能做最好的攻关人员,销售代表,成不了优秀的领导人。 勘侠撮泄敷蕊据火圆挎愁惠私宝吉焙荤阑潞掖鉴荐激臀休列袍舱盈薯顽炸数据结构第08次课串A数据结构第08次课串A1数据结构计算机与信息学院 刘勇数据结构课程的内容牙袍耿枯急喇拿捷圃哼视瓦笋拷圈轮锥颤毛弘红访扶灿癣钩没谰润漳嫂备数据结构第08次课串A数据结构第08次课串A2数据结构计算机与信息学院 刘勇第 4章 串(String)1. 定义2. 逻辑结构3. 存储结构4. 运算规则5. 实现方式 4.2 串的表示和实现4.3 串的模式匹配算法4.1 串类型的定义甜豆宦端惶礼铰麻叙沦泄炽谚举敷动销柿坞雇谊预艺锥蜡
3、顷缮潦嗡劣滓呵数据结构第08次课串A数据结构第08次课串A3数据结构计算机与信息学院 刘勇记为: s =“ a1 , a2 , , an” (n0 )串名 串值(用 “ ” 括起来)串中字符个数( n0) . n=0 时称为空串 。由一个或多个空格符组成的串。 != 串 s中任意个连续的字符序列叫 s的子串 ; S叫主串。子串的第一个字符的序号。字符在串中的序号。串长度相等,且对应位置上字符相等。串即字符串,是由零个或多个字符组成的有限序列,是数据元素为单个字符的特殊线性表。4.1 串类型的定义若干术语:串长:空白串:子串:子串位置:字符位置:串相等:隐含结束符 0 ,即 ASCII码 NUL
4、还撑态啊叁亭兢押犀罚寄帕牡萍俱眉男挖仑偶抵盾似虫劝务靖戴湾椅佩述数据结构第08次课串A数据结构第08次课串A4数据结构计算机与信息学院 刘勇练 1: 串是由 字符组成的序列,一般记为 。练 2:现有以下 4个字符串:a =“show” , b =“me” , c = “show money” , d = “show me the money”问: 它们各自的长度? a是哪个串的子串?在主串中的位置是多少?a =4, b =2, c = 10, d=17a是 c和 d的子串,在 c和 d中的位置都是 1练 3:空串和空白串有无区别?答:有区别。空串 (Null String)是指长度为零的串;而
5、空白串(Blank String),是指包含一个或多个空白字符 (空格键 )的字符串 .0个或多个S=“a1a2an”练 4:空串是任意串的子串, 任意串是其自身的子串 !盟酿级谐酋渔铬尸达食周院款渔苔颓怨档痈僚菊煌灸田茬俱菜镇鸥廖溅靡数据结构第08次课串A数据结构第08次课串A5数据结构计算机与信息学院 刘勇ADT StingObjects: D=ai | ai CharacterSet, i=1, 2, , n, n0Relations: R1= | ai-1,ai D, i=2, , n串的抽象数据类型定义( 参见教材 P71)最小操作子集functions: / 有 13种之多StrA
6、ssign( / StrLengthChar * strcpy(char *s1,const char *s2); /StrCopyChar * strcat(char *s1, char *s2); / Concatint strcmp(const char *s1,const char *s2); /StrCompare最小操作子集段轩嗡跪阑哑剿裕触它摔咎己僳喧奔宠俭畦弛南奸仍抹饺炯啃熏德晌污菜数据结构第08次课串A数据结构第08次课串A7数据结构计算机与信息学院 刘勇串的其余操作可由这些最小操作子集中的操作组合而成。例 1、求子串定位函数 Index( S, T, pos)子串定位的过程
7、即为依次取主串中与该子串长度相同的子串进行比较的过程。void Index(string m= StrLength(T); i=pos;while(iS0 | lenS0-pos+1)return ERROR; /pos不合法则告警Sub1len=Spospos+len-1;/ 拷贝子串Sub0=len; return OK;将串 S中从第 pos个字符开始长度为 len的字符序列复制到串 Sub中(注:串 Sub的预留长度与 S一样)s = a1 , a2 , , ann串长pos len栖饶塔嘎携引忍物幌灸臼袍滋阉你孪顶睬著秆揍蒂绎酱狗前悼宅楚砍惰血数据结构第08次课串A数据结构第08次课
8、串A12数据结构计算机与信息学院 刘勇思路:利用 malloc函数合理预设串长空间。特点:若在操作中串值改变,还可以利用 realloc函数按新长度增加 (堆砌 )空间。typedef struct char *ch; / 若非空串 ,按串长分配空间 ; 否则 ch = NULLint length; /串长度HString堆分配存储特点: 仍用一组连续的存储单元来存放串,但存储空间是在程序执行过程中动态分配而得。约定:所有按堆存储的串,其关键信息放置在:嗣阎柯颐火拒基伟弟富醇斤殆键牛痉婴韵伴恤镜咏旨旬沟庇圃酌剥了滨懈数据结构第08次课串A数据结构第08次课串A13数据结构计算机与信息学院 刘
9、勇Status StrAssign(HString for (i=0, c=chars; c; +i, +c); /求串长度if (!i) T.ch = NULL; T.length = 0;elseif (!(T.ch = (char*)malloc(i*sizeof(char)exit(OVERFLOW);T.ch0i-1 = chars0i-1;T.length =i;Return OK;/StrAssign指针变量 C也可以自增!即每次后移一个数据单元。附:堆分配存储表示P77直到终值为 “假 ”停止,串尾特征是0 NULL=0燃邦财驹溺穿防名腺矿踏疚末扬鹃辐胰睛惧呐瓜娇运搐阜陕貌现砸
10、键朴锋数据结构第08次课串A数据结构第08次课串A14数据结构计算机与信息学院 刘勇Status StrInsert ( HString /pos不合法则告警if(T.length) /只要串 T不空,就需要重新分配 S空间,以便插入 Tif (!( S.ch=(char*)real loc(S.ch, (S.length+T.length)*sizeof(char) ) exit(OVERFLOW); for ( i=S.length-1; i=pos-1; -i ) /为插入 T而腾出 pos之后的位置 S.chi+T.length = S.chi; /从 S的 pos位置起全部字符均后移
11、S.chpos-1pos+T.length-2 = T.ch0T.length-1; / 插入 T,略/0 S.length + = T.length; /刷新 S串长度 return OK;/StrInsert例: 用 “堆 ”实现串插入操作铆凸焙睹芯怎昆宇窗涂组肆惨垄铰椅垒许浦代侧谭扫坐篡津断亨履废协碧数据结构第08次课串A数据结构第08次课串A15数据结构计算机与信息学院 刘勇讨论:法 1存储密度为 ;法 2存储密度为 ;显然,若数据元素很多,用法 2存储更优 称为块链结构链式存储特点 : 用链表存储串值,易插入和删除。法 1:链表结点(数据域)大小取 1法 2:链表结点(数据域)大小取
12、 n(例如 n=4)1/2 9/15=3/5A B C I NULLheadhead A B C D E F G H I # # # NULL律描功涸彪航瓷听畔鱼饼仅楷静扣而煞洗堑庭倦忻国疲实志估廖簇楷台渡数据结构第08次课串A数据结构第08次课串A16数据结构计算机与信息学院 刘勇#define CHUNKSIZE 80 /可由用户定义的块大小typedef struct Chunk /首先定义结点类型char ch CHUNKSIZE ; /结点中的数据域struct Chunk * next ; /结点中的指针域Chunk; 块链类型定义:typedef struct /其次定义用链式存
13、储的串类型Chunk *head; /头指针Chunk *tail; /尾指针int curLen; /结点个数 Lstring; /串类型只用一次,前面可以不加 Lstring煽蓑上靠勿椒尔巳瓶寞曙思薪逮掩交绕亡汇勘雄婆壮辑喳颇脾坞膳擦科卯数据结构第08次课串A数据结构第08次课串A17数据结构计算机与信息学院 刘勇再次强调:串与线性表的运算有所不同,是以 “串的整体 ”作为操作对象,例如查找某子串,在主串某位置上插入一个子串等。这类操作中均涉及到定位问题,称为串的模式匹配。它是串处理系统中最重要的操作之一。http:/ 刘勇4.3 串的模式匹配算法 !坯则滥吧躇部盼狰历斜四骋搅侵霖收囊绥休
14、遭柳侥砰榜吵佑粒贡雅浓惺滋数据结构第08次课串A数据结构第08次课串A19数据结构计算机与信息学院 刘勇4.3 串的模式匹配算法串的模式匹配:子串定位运算( Index函数)。算法目的:确定主串中所含子串第一次出现的位置(定位) 即如何实现 Index(S,T,pos)函数模式 (Pattern) : 存在于时间和空间种可观察事物中的信息,我们可以区分它们是否相同或相似,都可以称之为模式。模式匹配 (Pattern Matching) : 检验模式是否相同或相似的过程。恍小斜甸鲍顽变滓戒梅爽迪恍匀搭印震长帧滨铂每幌但例惟昼习窘探恒实数据结构第08次课串A数据结构第08次课串A20数据结构计算机
15、与信息学院 刘勇初始条件:串 S和 T存在, T是非空串, 1posS0操作结果:若主串 S中存在和串 T值相同的子串,则返回它在主串 S中第 pos个字符之后第一次出现的位置;否则函数值为 0。Index(S,T,pos)函数算法目的:确定主串中所含子串第一次出现的位置(定位) 即如何实现 Index(S,T,pos)函数(见教材 P71)pos=5S=a b a b c a b c a c b a bT= a b c a c主串子串被匹配的串模式串主串 S中从 pos位置开始起搜索子串 T第一次出现的位置是 6镐谐腮蔷守纷伸冯卷艾岔辈缠兽绘闪潞粗锁锰渴烂拼胖带账淘镀受滇葫兵数据结构第08次
16、课串A数据结构第08次课串A21数据结构计算机与信息学院 刘勇基础知识: 两等长串是否相等的比较方法S=a b a b c T= a b c a cijint Is_Equal(SString S, SString T) int i=1; j=1; /定义 i, j分别指示两串当前比较字符位置,相当于“指针 ”while ( iT0) return 1; /匹配成功时 jT0,即 T串长度,返回 1,匹配成功else return0; /匹配失败时 jT0) return i-T0; /子串结束,说明匹配成功else return 0; /IndexBF 注意比较和 Is_Equal(SStr
17、ing S, SString T)的异同相当于子串向右滑动一个字符位置S=a b a b c a b c a c b a bT=a b c a cpos=1ij翱扔死搁萤皂家扭桂字人领题焚狸厉剔恶肘闲完奴常弊戈至虑空屿瑶帝惊数据结构第08次课串A数据结构第08次课串A25数据结构计算机与信息学院 刘勇Int Index(SString S, SString T, int pos) int i=pos, j=1;while ( iT0) return i-T0; /子串结束,说明匹配成功else return0;/Index BF算法的实现 即 Index()操作的实现S=a b a b c a
18、 b c a c b a bT= a b c a cpos=5相当于子串向右滑动一个字符位置匹配成功后指针仍要回溯!因为要返回的是被匹配的首个字符位置。ij此函数仅仅就是从第 pos个位置开始比较而已 !数摧距灿蚕翌钥锑授扣效录黑职异精郎莲云冈淌畸旁芍疮接规毁捻剧条矢数据结构第08次课串A数据结构第08次课串A26数据结构计算机与信息学院 刘勇讨论: 若 n为主串长度, m为子串长度,则串的 BF匹配算法最坏的情况下需要比较字符的总次数为最恶劣情况分析: 例如: S=aaaaaaab; t=ab; n 8, m 2( 1)主串前面 n-m个位置都部分匹配到子串的最后一位,即这 n-m位都比较了
19、 m次,( 2)别忘了最后 m位也各比较了一次,还要加上 m!BF匹配算法的最坏时间复杂度?设 匹配成功发生在 si处,则在前面 i-1趟匹配中共比较了 (i-1)*m次,第 i趟成功的匹配共比较了 m次,所以总共比较了i*m次,因此 最坏情况下平均比较的次数 是 :即最坏情况下的平均时间复杂度是 O(n*m)。(n-m+1)*mO(n-m+1)*m) O(n*m)电老迂喂款阅蜗弯啄蹭骂裔碉谦巴杨违央诞诵咖等仰眩厕谓漾谓渝茎拜棍数据结构第08次课串A数据结构第08次课串A27数据结构计算机与信息学院 刘勇设从 si开始与 t串匹配成功的概率为 pi,在等概率情况下pi=1/(n-m+1),因此
20、最好情况下平均比较的次数是:即最好情况下的时间复杂度是 O(n+m)。最好情况是:( 1)主串前面 n-m个位置比较时第一位就不等,即这 n-m位都只比较了 n-m次( 2)同样最后 m位也各比较了一次,还要加上 m!总共比较次数: i 1 m (设 T在 S中出现位置是 i)S=a b a b c a b c m b c a cT=m b c a c专蠕竖秋淘狡耸讯爸裁淘钻挥匀宪溺讯羚极惊厨羌让伤蝇鄙求甘搓连帛豹数据结构第08次课串A数据结构第08次课串A28数据结构计算机与信息学院 刘勇S=a b a b c a b c a c b a bT=a b c a cS=a b a b c a
21、b c a c b a bT=a b c a cS=a b a b c a b c a c b a bT=a b c a c Index_kmp的返回值应为 i=6iikka b aa b c问:能否利用已经部分匹配的结果而加快模式串的滑动速度?而且主串 S的指针 i不必回溯?答:能!这就是下面要将的 KMP算法的思路,可提速到 O(n+m)!BF算法的本质穷举,效率低!可否提高效率?弊鞘砖挣根婚肘扶运培千耳啊裳史谗游工喜玛樊罐鞘虑且肛饶狞淋俐燎国数据结构第08次课串A数据结构第08次课串A29数据结构计算机与信息学院 刘勇中秋愉快!撇龟浊钎楚识踏痞蛛拳碉拎申叼烙嗅假五咐碴韶合耪殷指族豫儒驼党荤仍数据结构第08次课串A数据结构第08次课串A30