KMP算法理解
- 1.KMP算法来源
KMP算法是由克努斯-莫里斯-普拉特共同创造,KMP分别是这三位名字的开头英文字母。 - 2.KMP算法和朴素匹配模式算法的时间复杂度比较
朴素匹配模式算法的时间复杂度分析:
假设目标串长度为m,模式串长度为n。最坏的情况下,是每一次匹配到最后一步发现不同,
然后指针回溯,直至匹配到最后。如目标串为"wwwwa" 而模式串为"wwa"。发现每次比较
到最后都不相等直至最后一次比较才相等。
通过归纳总结最坏情况下,每轮比较要比较n次,而要比较m-n+1轮。即时间复杂度为
o(n*m)-o(n*n)+o(n)==o(n*m) 。而KMP算法将朴素匹配模式算法进行改进得到线性的
时间复杂度o(n+m)
注意:在最坏情况下。朴素匹配模式算法的时间复杂度才达到o(n*m),一般情况下朴素
匹配模式算法的时间复杂度接近于o(n+m)。
- 3.最长前后缀匹配长度
特别强调:前缀和后缀的字母比较都是从左到右的。而不是前缀从左到右而后缀从右到左
最长前后缀匹配长度:如模式串"abbabd"当指针指向了d,其前面有"abbab"
在"abbab"中,假设前后缀匹配长度为1,那么前缀为a 后缀为b 发现前后缀不相等故不能为1。 假设前后缀匹配长度为2 那么前缀为ab 后缀也为ab 此时前后缀相等故前后缀匹配长度可以为2。假设前后缀匹配长度为3那么前缀为abb后缀为bab不相等故不能为3(两者都是从左到右开始比较判断是否相等 如前缀abc和后缀def。a和d比较,b和e比较,c和f比较)。而前后缀匹配长度可能不唯一。但应该取最长前后缀匹配长度(取得是前后缀相等的最长前后缀匹配长度)。