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

字符串匹配算法(四)可以滑动多远.pdfVIP

  1. 1、本文档共4页,可阅读全部内容。
  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文档。上传文档
查看更多
字符串匹配算法(四)可以滑动多远

得在穷举法中,每一趟比较后,无论成与不成,都将模式向右滑动一个位置,然后继续比较。有没有办 法能利用之前的比较结果,使得模式滑动的更远一点呢? 在介绍经典的KMP 算法前,我先介绍几个简单的滑动类算法。 Not So Naive 同名字一样,这个算法的确有点幼稚,它根据模式的前两个字符是否相同来滑动比穷举法稍长一点的距离: 如果前两个字符相同,那么文本中与第二个字符不同则必然也与第一个不同;如果前两个字符不同,则与 第二个相同的文本字符必然与第一个不同。 那么这两种 况下不用比较都可以断定,文本字符与模式的第一个字符肯定不相同,于是能比穷举法多滑 动1 个位置。 代码见下: 1. void NSN(char *x, int m, char *y, int n) { 2. int j, k, ell; 3. 4. /* Preprocessing */ 5. if (x[0] == x[1]) { 6. k = 2; 7. ell = 1; 8. } 9. else { 10. k = 1; 11. ell = 2; 12. } 13. 14. /* Searching */ 15. j = 0; 16. while (j = n - m) 17. if (x[1] != y[j + 1]) 18. j += k; 19. else { 20. if (memcmp(x + 2, y + j + 2, m - 2) == 0 21. x[0] == y[j]) 22. OUTPUT(j); 23. j += ell; 24. } 25. } 26. 27. 这个算法仅需要常数时间和空间的预处理,比较过程中,先比较模式第二个字符,然后比较其余位置,为 的就在某些 况下省掉第一个字符的比较,达到滑动的目的。不过复杂度依然是O(mn)的,比起穷举法或 者有轻微改善吧。 想法的确够幼稚,仅仅只考虑了两个模式字符,滑动的步子也太小,能否考虑的更多一点呢?下面请看 Quick Search 算法。 Quick Search 见到这个名字,不禁让人想起快速排序了,快速排序在最坏 况下是n 平方的复杂度,而通常 况下速度 超级快,Quick Search 莫非也是这样的?没错,就是这样,这个算法在模式长度短而字母表大时,有着 优异的表现,尽管它的有哪些信誉好的足球投注网站时间复杂度是O(mn)。 算法的思想是这样,如果文本中某个字符根本就没在模式中出现过,那么就不需要再 和模式中的任何一 个比较;如果该字符出现过,那么为了不漏掉可能的匹配,只好与最晚出现过的位置对齐进行比较了。 代码如下: 1. void preQsBc(char *x, int m, int qsBc[]) { 2. int i; 3. 4. for (i = 0; i ASIZE; ++i) 5. qsBc[i] = m + 1; 6. for (i = 0; i m; ++i) 7. qsBc[x[i]] = m - i; 8. } 9. 10. 11. void QS(char *x, int m, char *y, int n) { 12. int j, qsBc[ASIZE]; 13. 14. /* Preprocessing */ 15. preQsBc(x, m, qsBc); 16. 17. /* Searching */ 18. j = 0; 19. while (j = n - m) { 20. if (memcmp(x, y + j, m) == 0) 21. OUTPUT(j); 22. j += qsBc[y[j + m]]; /* shift */ 23. } 24. } 25. 26. 理解这个算法,请看

文档评论(0)

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

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

1亿VIP精品文档

相关文档