您的位置:首页 > 其它

理解KMP算法

2011-07-24 23:32 253 查看
以前上数据结构时,对KMP算法一直很忌惮。现在回过头来看这个算法,还是比较简单的。
在源串中查找匹配的子串时,当子串中的某一位与源串中的对应位不匹配时,我们需要重新定位在源串中的查找位置,进行下一轮查找。
1.简单的想法,一位一位跳,每次匹配不成功后,匹配源串中当前匹配起始位置的下一个字符。
2.由一位一位的跳步中可以看到子串与源串的不匹配位之前的各位字符已经相互比较过。于是,如果下一次能够匹配成功,需要在匹配过的串中找到与子串的前若干字符相匹配的串,并且这些串由目前的比较结果来看,并不明显导致不匹配结果。因此,满足条件的只有可能是当前不匹配位的前若干连续字符,这些字符需要一次与匹配串的前若干位相对应。因此,就有了当前位不匹配是,子串中的需要哪一位与当前位相比较。
于是,有了next值的概念,next值即为当前位不匹配时,字串中需要与当前位进行匹配检查的是哪一位。
next=0,表明字串中没有任何位可以与当前位比较,即字串需要从当前不匹配位的下一位重新开始比较,这对应与字串中第一位就不匹配的情况
next=k,k=max{'p1p2...p(k-1)'='p(pos-k+1)....p(pos-2)p(pos-1)'},这种情况适用于非子串第一位匹配,并且子串中不匹配位之前的k-1位与依次对应子串的第1~k-1位。
上述两中情况都不满足时,就说明在已经匹配的位中不可能再找到能够成功匹配子串的部分串。因此,需要将字串中第一位与当前不匹配位进行比较,即next=1
主串:[...........................][字串的前n位] [子串的前m位] [字串的前k-1位]p

子串: [字串的前n位] [子串的前m位] [字串的前k-1位]p
如上,当p位发生不匹配时,我们需要寻找最有希望的最长匹配前缀从主串的某一位置开始匹配,明显这里有三个匹配前缀,但对前两个前缀,他们的最末尾的下一位都不可能再与子串的对应位匹配,只有p前的k-1位还有匹配成功的希望。于是每次发生不匹配时,我们只关心不匹配位的前若干位.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: