modify some mistakes.
This commit is contained in:
@@ -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的改进
|
||||
|
||||
|
||||
Reference in New Issue
Block a user