KMP时间复杂度分析

比较过程分析

《KMP时间复杂度分析》

比较次数

比较次数: 红色 + 蓝色
蓝色部分是相比暴力求解,节省下的比较次数

周期

从比较次数可以看出,呈现 1 1 1 1 5 这样的周期

  • 一个周期内的比较次数:8
  • 周期长度:5
  • 周期个数:n/5
  • 比较总次数: 周期个数 * 一个周期内额比较次数 = 1.8n

一般化结论:
– 一个周期内的比较次数:1 * (M – 1) + M
– 周期长度:M
– 周期个数:N/M
– 比较总次数: 周期个数 * 一个周期内额比较次数 = (2 – 1/M)*N < 2N

因此是线性

接下来证明,上述情况是KMP算法的最差情况

最差情况

  1. 模式串
    当模式串长度为M,首字符和其他字符全都相等(假定都为a),模式串存在最长的k前缀和k后缀, next数组呈现递增样式:-1,0,1,2…
  2. 需要匹配的字符串
    • 串成周期性分布,周期为M
    • 前M-1都为a,第M位不等于a

模式串

模式串的最坏情况比较好理解,因为每次当s[i] 不等于 P[j]时,j = next[j],一直按照next数组值进行回溯,当模式串全相等时,next数组呈现递增,每次回溯一个位子,因此比较次数是最多的

待匹配字符串

  1. 为什么呈现周期性的字符串满足
    假设存在一个字符串,使得模式串匹配完,比较次数最多,那么以这个子串为基础形成的周期性字符串一定也是匹配次数最多的
  2. 一个比较次数最多的子串,如何构造
    假设不在M处失配,而是在k处就失配了,那么匹配次数为(k – 1)*1 + k,由上面的公式可以得到,当k = m时,比较次数是最多
    《KMP时间复杂度分析》

比较总次数:15 < 18
《KMP时间复杂度分析》

最好情况

  1. 模式串
    当模式串的首字符和其他字符都不相等时,模式串不存在相等的k前缀和k后缀,next数组全为-1
  2. 需要匹配的字符串
    无要求
    原文作者:KMP算法
    原文地址: https://blog.csdn.net/niukai1768/article/details/79579709
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞