《数据结构C语言版》---第04章.pptVIP

  1. 1、本文档共37页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
第4章 串 4.1 串 3、C语言的串函数 4.2 串的存储结构 (1)静态数组结构:用静态内存分配方法定义的数组。由于此时数组元素的个数是在编译是确定的,在运行时是不可改变的,所以也称为定长数组结构。 (1)单字符结点链 typedef struct Node { char str; struct Node *next; } SCharNode; 4.3 串操作的实现 (1)初始化操作 void Initiate(DString *S, int max, char *string) { int i, m; S-length = strlen(string); if(S-length max) m = S-length; else m = max; S-maxLength = m; S-str = (char *)malloc(sizeof(char)*m); for(i = 0; i S-length; i++) S-str[i] = string[i]; } 4.3 串的模式匹配算法 (3)BF算法的时间复杂度 若n为主串长度,m为子串长度,则串的BF匹配算法最坏的情况下需要比较字符的总次数为(n-m+1)*m=O(n*m) 最好的情况是:一配就中!主串的前m个字符刚好等于模式串的 m个字符,只比较了m次,时间复杂度为O(m)。 最恶劣情况是:模式串的前m-1个字符序列与主串的相应字符序列比较总是相等,但模式串的第m个字符和主串的相应字符比较总是不等,此时模式串的m个字符序列必须和主串的相应字符序列块一共比较n-m+1,所以总次数为:m*(n-m+1),因此其时间复杂度为O(n×m)。 KMP算法的思想: 设s为主串,t为模式串,设i为主串s当前比较字符的下标,j为模式串t当前比较字符的下标,令i和j的初值为0。当si = tj时,i和j分别增1再继续比较;否则i不变,j改变为next[j]值(即模式串右滑)后再继续比较。依次类推,直到出现下列两种情况之一:一是 j退回到某个j=next[j]值时有si = tj ,则i和j分别增1后再继续比较;二是j退回到j=-1时,令主串和子串的下标各增1,随后比较si+1和t0 。这样的循环过程一直进行到变量i大于等于size或变量j大于等于size时为止。 3、BF与KMP算法的运行效率比较 第一次匹配 s= t= c d d c d c c d c i=2 j=2 失败 第二次匹配 s= t= c d d c d c c d c i=1 j=0 失败 第三次匹配 s= t= c d d c d c c d c i=2 j=0 失败 第四次匹配 s= t= c d d c d c c d c i=5 j=2 成功 第二种情况是模式串中有真子串。设主串s=“abacabab”、模式串t=“abab”。 第一次匹配过程如下图所示。此时, 因t0≠t1,s1=t1,必有s1≠t0;又因t0=t2,s2=t2,必有s2=t2, 因此接下来可直接比较s3和t1。 s= t= a b a c a b a b a i=3 j=3 失败 a b b 总结以上两种情况可以发现,一旦si和tj比较不相等,主串的si(或si+1)可直接与模式串的tk(0≤kj)比较,k的确定与主串s并无关系,而只与模式串t本身的构成有关,即从模式串本身就可求出k的值。 一般情况下,设s=s0s1...sn-1,t=t0t1...tm-1,当si≠tj(0≤in,0≤jm)时,存在 si-jsi-j+1…si-1 = t0t1…tj-1“ 此时若模式串中存在可相互重叠的真子串,满足 t0t1...tk-1 = tj-ktj-k+1…tj-1 (0kj) 则说明模式串中的子串“t0t1…tk-1”已和主串“si-ksi-k+1…si-1”匹配。下一次可直接比较si和tk; 此时若模式串中不存在可相互重叠的真子串,则说明在模式串t0t1…tj-1”中不存在任何以t0为首字符的字符串与“si-jsi-j+1…si-1”中以si-1为末字符的

文档评论(0)

nuvem + 关注
实名认证
文档贡献者

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

1亿VIP精品文档

相关文档