我对Knuth Morris Pratt字符串匹配算法的最坏情况运行时间有疑问:
让我们说T = AAAAB和P = AB。
在这种情况下,前缀表是:
#P Sk-D
0 A 0
1 B 0
当我扫描T并比较P的值时: AAAAB AB Cell#0有部分匹配。由于P的Cell#0的跳过距离为0,我们将P移动到下一个单元: AAAAB AB
因此,相同的场景将重复三次(6次比较),直到T匹配子串," AB"在P(2更多的比较)。总共有8个比较= P的长度* T的长度 - T的长度= 5 * 2 - 2 = 8 = O(mn)-O(m)= O(mn)。显然,这不是O(m + n),这是KMP算法的最坏情况。
我做错了什么?我觉得我的前缀表是不正确的,但是如果我遵循P中最长后缀的定义,那么我在前缀表中看不到任何其他值,这也是P"中的前缀。
如果有任何帮助,我将不胜感激。
谢谢!