字符串查找的KMS算法.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
字符串查找的KMS算法

字符串查找的KMS算法 介绍KMS算法原理的教程很多,也给出了c程序代码,不过如何根据原理编写程序只字不提,所以我这里解读程序的实现过程。 源字符串 C B A B C A B A B C A B C A B A B C A B D 匹配字符串 A B C A B A B C A B D 1 A B C A B A B C A B D 2 A B C A B A B C A B D 3 A B C A B A B C A B D 4 A B C A B A B C A B D 5 A B C A B A B C A B D 6 A B C A B A B C A B D 7 A B C A B A B C A B D 8 A B C A B A B C A B D 9 A B C A B A B C A B D 10 A B C A B A B C A B D 普通字符串查找是这样的,从首字符开始,源字符串和匹配字符串对齐,如果相同,匹配字符串不后移,比较下一个,如果不相同,匹配字符串后移一位,重新比较。 KMS算法的灵感来源于,如果源字符串和匹配字符串已经有一部分相同,再遇到不同字符的时候,向后移动匹配字符串,可以看作匹配字符串在与自身比较,那么可以提前计算出匹配字符串内部匹配的字符个数,这部分字符就不需要重复比较了。 程序分成两个循环过程,一是匹配字符串与自身比较,二是匹配字符串和源字符串比较。前一个为后一个服务,两个过程类似。匹配字符串与自身比较的过程,分析后一位的时候,包含了前面所有的字符,可以利用前面的结果。 数组tNext()表示每个位置的内部匹配的位置, i表示字符串当前准备计算的位置,j表示移动字符串后跟位置i对齐的位置,数组下标从0开始,用-1表示没有内部匹配。内部匹配的实例,匹配字符串起点位置是0,分析到第10个字符时,i=9,研究对象是ABCABABCAB,每次后移一位,再字符对齐,后移3位后,前7个字符ABCABAB和后7个字符ABABCAB不匹配,后移5位后,前5个字符ABCAB和后5个字符ABCAB第一次匹配,这时跟i对齐的位置j=4,内部匹配的位置是tNext(9)=4。 分析匹配字符串的循环节,判断所有可能情况。如果位置i和位置j的字符相同,那么i和j在原来的基础上加1。不相等的情况,如果前面不匹配,那么继续不匹配(对应-1),后移一位,如果前面有匹配,那么j=tNext(j-1)+1。例如ABCABABCABD计算到最后一位时,利用前面分析ABCABABCAB时的结果,i=9,j=4,tNext(9)=4,因为获得匹配,i和j都加1,现在位置i=10的D和位置j=5的A不同,需要继续后移,当ABCABABCAB的前2个字符AB和后2个字符AB相同时,才需要用下一个字符C来与D比较,这个后移的过程相当于ABCAB内部匹配的过程, ABCAB的内部匹配结果是tNext(5-1),通过链式递减,直到递减到0或者获得匹配。 下面的代码是在EXCEL的VBA里面编辑的,网上只找到C语言代码,我根据自己的理解,转成VB代码,有一点变化,跟vb的instr函数比较,结果正确。 Function InStrX(SourceString() As Byte, FindString() As Byte) As Long Dim i As Long, j As Long Dim U1 As Long, U2 As Long Dim tNext() As Long VB字符串使用unicode编码,每个字符2字节 字符串和索引数组下标从0开始 U1 = UBound(SourceString) U2 = UBound(FindString) ReDim tNext(0 To U2) tNext(0) = -2 i = 2 当前计算的位置,从首字符下一个开始 j = 0 Do While i = U2 If FindString(i) = FindString(j) And FindString(i + 1) = FindString(j + 1) Then tNext(i) = j i = i + 2 j = j + 2 Else If j = 0 Then tNext(i) = -2 i = i + 2

文档评论(0)

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

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

版权声明书
用户编号:7014141164000003

1亿VIP精品文档

相关文档