noip && pkm

kmp是一个比较优秀的的字符串匹配算法,相比于经典的字符串匹配有了极大的改进


基本思想

主串:a b a c a a b a c a b a c a b a a b b,下文中我们称作T

模式串:a b a c a b,下文中我们称作W

在暴力字符串匹配过程中,我们会从T[0] 跟 W[0] 匹配,如果相等则匹配下一个字符,直到出现不相等的情况,此时我们会简单的丢弃前面的匹配信息,然后从T[1] 跟 W[0]匹配,循环进行,直到主串结束,或者出现匹配的情况。这种简单的丢弃前面的匹配信息,造成了极大的浪费和低下的匹配效率。

然而,在KMP算法中,对于每一个模式串我们会事先计算出模式串的内部匹配信息,在匹配失败时最大的移动模式串,以减少匹配次数。

比如,在简单的一次匹配失败后,我们会想将模式串尽量的右移和主串进行匹配。右移的距离在KMP算法中是如此计算的:在已经匹配的模式串子串中,找出最长的相同的前缀和后缀,然后移动使它们重叠。

在第一次匹配过程中

T: a b a c a a b a c a b a c a b a a b b

M: a b a c ab

在T[5]与W[5]出现了不匹配,而T[0]~T[4]是匹配的,现在T[0]~T[4]就是上文中说的已经匹配的模式串子串,现在移动找出最长的相同的前缀和后缀并使他们重叠:

T: a b a c aab a c a b a c a b a a b b

M: a b a c ab

然后在从上次匹配失败的地方进行匹配,这样就减少了匹配次数,增加了效率。

引自http://baike.so.com/doc/5460302-5698691.html;


在我看来kmp算法的基础在于对LCS的运用 查询过程中 若出现不匹配的现象 就可用LCS查找最长公共子序列

你可能感兴趣的:(noip && pkm)