KMP算法是由Knuth、Morris和Pratt于1969年夏天提出的快速串匹配算法。它是由对BF算法的很大改进而成的,这主要体现在每当某趟匹配失败时,指针不必回溯,而是利用已经得到的“部分匹配结果”将模式向右滑动若干位置后得到。由于KMP算法避免了BF算法中频繁的回溯,普遍提高了模式匹配的工作效率,因此它又被称为“不回溯的字符串搜索算法”
KMP算法几乎可以在所有讲述算法的书中找到,之所以这个算法如此受到推崇(尽管它实际应用不如后面的BM算法),其中一个重要原因是它的发明者之一Knuth实在是太有名了。Donald E . Knuth于1938年1月10日出生在美国,他是数据结构与算法的奠基人,是这门科学的鼻祖。1963年。25岁的Knuth在加州理工学院获得其数学博士学位,同年开始着手撰写著名的《The Art of Computer Programming》一书,全书预计共7卷,该书的第一卷于1968年完成,目前已经出版了3卷。1974年,36岁的Knuth称为有史以来第9位图灵奖获得者,也是到目前为止最年轻的获得者,那年他36岁。
KMP算法正是基于这样的思想,算法在对字符串进行匹配前,先计算出模式字符串中各个字符的关系,然后再依据此关系对模式字符串与目标字符串进行匹配。
今天系统地学习了KMP算法 附原文链接
写一个KMP
void KMP(int i,int j,char P[],char T[])
{
int i=start,j=0;
while(P[j]!='\0'&&T[i]!='\0')
{
if(j==-1||P[j]==T[i])
{
i++;
j++;
}
else j=next[j];
}
if(T[j]=='\0') return(i-j);
else return -1;
}
犹如醍醐灌顶 其实最核心的思想就是通过分析子串的最长前后缀 进行比对后,子串和母串相同部分拥有相同的前后缀,因此比对的时候直接跳到下一个后缀就可以了;