您的位置:首页 > 其它

模式匹配算法

2016-05-04 23:24 274 查看
转载至:http://www.cnblogs.com/mikelin/archive/2010/08/10/1796607.html模式匹配模式匹配的具体含义是在主串s中从start开始查找一个与模式串t相同的子串。如果找到则返回模式串t的第一个字符在主串中的下标;如果未找到则返回-1。1.模式匹配的Brute-Force算法Brute-Force算法实现模式匹配的思想是:从主串s=”s0s1…sn-1”的第一个字符开始和模式串t=”t0t1…tn-1”的第一个字符比较,若相等,则继续比较后续字符;否则从主串s的第二个字符开始重新与模式串t的第一个字符比较。如此不断继续,若存在模式串中的每个字符依次和主串中的一个连续字符序列相等,则匹配成功,返回模式串t的第一个字符在主串中的下标;否则匹配失败,返回-1。
2.模式匹配的 KMP 算法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(此时模式串下标便退回0:j = j + 1 = -1 + 1 = 0),再继续比较。其中,我们把模式串中从第一个字符开始到任一个字符为止的模式串中的真子串定义为next[j]函数,则next[j]函数定义为:①next[j]= max{ k | 0<k<j 且“t0t1…tk-1” = “tj-ktj-k+1…tj-1”}
当此集合非空时②next[j]= 0 其他情况③next[j]= -1 当 j = 0 时若模式串t中存在真子串“t0t1…tk-1” = “tj-ktj-k+1…tj-1”,且满足0<k<j,则next[j]表示当模式串t中的tj与主串s的si比较不相等时,模式串t中需重新和主串s的si比较的字符下标为k,即下一次开始比较si和tk;若模式串t中不存在如上所说的真子串,有next[j]
= 0,则下一次开始比较si和t0;当j = 0时,令next[j] = -1,此处-1为一标记,表示下一次开始比较si+1和t0.简而言之,KMP算法对Brute-Force算法的改进就是利用已经得到的部分匹配结果将模式串t右滑一段距离再继续比较,从而无需回退主串s的下标值。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: