告别年代

阳光里闪耀的色彩真美丽

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

[作者:byeyear 首发:cnblogs 转载请注明]

关于KMP算法,教科书和网上都能找到很多资料,算法分析过程各有千秋。这里我们使用一种独特的图示法来对其进行分析,如果KMP让您感到压力,这篇文章或许能让您身上一轻。虾米,KMP是虾米东东?额,请关闭此页面。

 我们用下面这张图表示文本串和模式串。这里我们没有使用指针的概念,而是在画图的时候让文本串和模式串的待比较部分对齐:

 

两个长条分别表示文本串和模式串。阴影部分是已经匹配的,阴影之后的一个字符发生了失配,于是我们需要将模式串右移,以进行下一次匹配。最直观的方式是右移一个字符,那么我们能不能多移几位呢?让我们近距离观察阴影部分。

 

假如模式串的阴影(已匹配)部分有这样的特征:已匹配部分的开始的若干字符等于结尾的若干字符,即C==D,那么因为这部分是已匹配的,就必然有A==B==C==D。于是下面这张图也一定是成立的:

上图中,B和C必然是匹配的。那就是说,我们可以将模式串一次性移动到B跟C对齐,并且只需从X和?开始比较。

但是且慢,我们先要确认一个问题:在A和B之间是否仍然存在着匹配可能?这里,我们只要保证C和D是满足相等条件的最长串,就可以保证A和B之间不存在匹配可能,因为从上图可以看出,C和D越长,模式串移动距离越小。当C和D为满足条件最长串,模式串的移动距离必然最小,于是A和B之间就不存在匹配可能。

上面就是关于KMP的另类图示分析。我还没发现有人用这个办法去理解KMP。我自己认为上面的图比使用具体的字符串做例子要好理解。客官您怎么看?

至于如何计算模式串的自匹配值,我们仍然可以用类似的方法进行图示分析,我就不再画图了。相信您一定可以搞定。

posted on 2013-01-24 21:05  告别年代  阅读(2142)  评论(2)    收藏  举报