From 0ad42f1f4f987413abea314b7b67ac0e1fdd0a16 Mon Sep 17 00:00:00 2001 From: Shine wOng <1551885@tongji.edu.cn> Date: Wed, 2 Oct 2019 16:52:24 +0800 Subject: [PATCH] modify some mistakes. --- thu_dsa/chp11/kmp.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/thu_dsa/chp11/kmp.md b/thu_dsa/chp11/kmp.md index c133982..98ccb27 100644 --- a/thu_dsa/chp11/kmp.md +++ b/thu_dsa/chp11/kmp.md @@ -64,7 +64,7 @@ K[0, next[i] - 1] = K[i - next[i] ,i - 1] next[i] = next[i - 1] + 1; ``` -可是如果不满足`P[i-1] = P[next[i-1]]`,则上一个位置的最长自匹配长度将在新的位置断裂,此时必有`next[i] <= next[i-1]`,所以只能到子串`P[0, next[i-1]]`中去寻找新的最长自匹配长度。由于`P[0, next[i-1]] = P[i-2-next[i-1] ,i-2]`,因此`next[next[i-1]] + 1`是`next[i]`的下一个候选值,如果有 +可是如果不满足`P[i-1] = P[next[i-1]]`,则上一个位置的最长自匹配长度将在新的位置断裂,此时必有`next[i] <= next[i-1]`,所以只能到子串`P[0, next[i-1])`中去寻找新的最长自匹配长度。由于`P[0, next[i-1]) = P[i-1-next[i-1] ,i-1)`,因此`next[next[i-1]] + 1`是`next[i]`的下一个候选值,如果有 ```c P[i-1] == P[next[next[i-1]]]; @@ -95,7 +95,7 @@ int* makeNext(char* str){ 应该看到,`next`表的构造的代码非常类似于`kmp`算法,这是因为`next`的构造本质上就是模式串的自我匹配,这个过程就是利用`kmp`的思想实现的。 -可以证明,`kmp`算法的时间复杂度是`O(m + n)`。证明如下:令`k = 2i - j`,在每一次迭代中,要么执行`i++, j++`,要么执行`j = next[j]`,其中`next[j] < j`,因此每次迭代中`k`都至少增加1,而`k`的最大值不过为`2n`,即循环至多进行`O(n)`次,每一次的时间复杂度都是`O(1)`,故总的时间复杂度为`O(n)`。 +可以证明,`kmp`算法的时间复杂度是`O(m + n)`。证明如下:令`k = 2i - j`,在每一次迭代中,要么执行`i++, j++`,要么执行`j = next[j]`,其中必然满足`next[j] < j`,因此每次迭代中`k`都至少增加1,而`k`的最大值不过为`2n`,即循环至多进行`O(n)`次,每一次的时间复杂度都是`O(1)`,故总的时间复杂度为`O(n)`。 ## kmp的改进