网站大量收购闲置独家精品文档,联系QQ:2885784924

北京化工大学数据结构课件第四章 串.ppt

北京化工大学数据结构课件第四章 串.ppt

  1. 1、本文档共25页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
四、模式匹配与KMP算法 模式匹配 在一个源串中搜索模式串的出现位置 四、模式匹配与KMP算法 朴素模式匹配算法 四、模式匹配与KMP算法 KMP算法 问题的提出——一个极端的例子 四、模式匹配与KMP算法 KMP算法 算法思想——nextval向量 四、模式匹配与KMP算法 KMP算法 算法思想——nextval向量 四、模式匹配与KMP算法 KMP算法 nextval向量的定义 对模式串T[0…n-1], 定义向量nextval[0…n-1]如下: nextval[i]表示: 当T[i]匹配失败时,下一次必要的匹配比较是 用T[nextval[i]]与源串的当前字符进行比较; 若模式串已不可能与源串的当前位置形成匹配,则记nextval[i]为一个特殊值,如-1。 四、模式匹配与KMP算法 KMP算法 nextval向量举例 四、模式匹配与KMP算法 KMP算法 在nextval向量指导下进行模式匹配 在源串和模式串上分别设立扫描指针i和j,从串首开始; 对源串和模式串的当前字符进行比较,直到源串或模式串扫描完毕: 若相等,则两个扫描指针同步前进; 否则,模式串扫描指针前移到nextval向量指示的位置,若nextval[i]为预定特殊值,则源串扫描指针前进,模式串扫描指针回到串首; 若模式串扫描完毕,则匹配成功,否则匹配失败。 四、模式匹配与KMP算法 KMP算法 nextval向量的计算 nextval向量的性质 最大相同首真子串与尾真子串 sj-i~sj-1=t0~ti-1(ti之前已经匹配成功) sj≠ti(ti匹配失败) t0~tk-1=ti-k~ti-1(根据模式串可以确定的可匹配部分) 不存在更大的满足条件3和5的k值(以保证匹配的必要性) ti≠tk(若ti=tk,则不须比较即可推知:sj≠tk) 四、模式匹配与KMP算法 KMP算法 最大相同首真子串与尾真子串的长度的计算 将T[0…i-1]的最大相同首真子串与尾真子串的长度,记为Ki 设已知Ki-1,求Ki: 令k从Ki-1开始; 若k=-1(特殊值),则Ki=0; 若t[k]=t[i-1],则Ki=k+1; 否则,将k前推至nextval[k],重复2; 四、模式匹配与KMP算法 KMP算法 nextval向量的计算 计算nextval[i]: 先计算T[0…i-1]的最大相同首真子串与尾真子串的长度Ki; 如果T[i]≠T[Ki],则nextval[i]=Ki, 否则nextval[i]=nextval[Ki] * * 4.1 串及其运算 是由零个或多个字符组成的有限序列,一般记为 s=“a1a2…an”(n?0) 其中,s是串名,用单引号(也可以是用双引号括起来的) 括起来的字符序列是串的值。ai可以是字母、数字或其他字符;串中字符的个数n成为串的长度。 第四章 串 子串:串中任意个连续的字符组成的子序列。 主串:包含子串的串相应地称为主串。 位置:字符在序列中的序号。子串在主串中的位置则以子 串的第一个字符在主串中的位置来表示。 相等:两个串的长度相等,并且对应位置的字符都相等。 注意区分空串与空格串的区别。 串的逻辑结构和线性表的区别: 1. 串的数据对象约束为字符集。 2. 线性表的基本操作大多以“单个元素”为操作对象,而 串的基本操作通常以“串的整体”作为操作对象。 对于串可以定义以下运算: 1. 置串为一个空串; 2. 判断一个串是否为空串 3. 求一个串的长度; 4. 将两个串拼接在一起构成一个新串; 5. 在一个串中,求从串的第i个字符开始连续j个字符所构成的子串; 6. 如果串S2是S1的子串,则可求串S2在串S1中第一次出现的位置。 1. 定长顺序表示 #define MAXNUM 1000 /* 串允许的最大字符个数 */ struct SeqString /* 顺序串的类型 */ { char c[MAXNUM]; int n; }SeqString, *PSeqString; 4.2串的存储表示 PSeqString subStr_seq(PSeqString s,int i,int j) /* 求从s所指的顺序串中第i(i0)个字符开始连续j个字符所构成的子串 */ { PSeqString s1; int k,m; s1 = createNullStr_seq( ); if (s1==NULL) return NULL; if ( i0 i=s-n j0 ) { if ( s-n i+j-1 ) j = s-n -i+1; for (k=0;kj;k++)

您可能关注的文档

文档评论(0)

ormition + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档