写在前面:
这只是博主自己的理解,没有什么纯理论的东西。博主尽可能的将如何得到Next[]数组的过程口语化,用最简单的方法求解。其中一定有不严谨的地方,敬请谅解。
求Next[] 数组值过程中可能出现的三种情况
- 一次比较就相同。(此时求解的Next[ ]值等于比较位置上的Next[ ]值)
- 在比较过程中得到相同元素。(此时求解的Next[ ]值等于比较位置上的Next[ ]值+1)
- 比较到最后仍得不到相同元素,即当可变位置为0时。(此时求解的Next[ ]值等于1)
求解过程
例:
j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
a |
b |
a |
a |
b |
c |
a |
c |
Next[j] |
0 |
1 |
|
|
|
|
|
|
首先将第一位和第二位分别置0和1
我们引进两个位置概念(这两者都是坐标概念)。
比较位置(即当前所求值元素的前一个元素的坐标)。
可变位置(比较位置的前一个位置坐标,随着比较过程的进行,这个坐标会变化)
求解第三位a
- 比较位置为2,可变位置1。
- 比较位置上的元素 ≠ 可变位置上的元素
- 不同时即要改变可变位置。新的可变位置 = Next[原来的可变位置] = 0
- 当可变位置变成0时,则没有与比较位置比较的元素。
- 这时我们只能求得Next[3] = 1(符合三种情况的第三种)
j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
a |
b |
a |
a |
b |
c |
a |
c |
Next[j] |
0 |
1 |
1 |
|
|
|
|
|
求解第四位a
- 比较位置为3,可变位置为2。
- 比较位置上的元素 ≠ 可变位置上的元素
- 可变位置=Next[原来可变位置] = Next[2] = 1
- 比较位置上的元素 = 可变位置上的元素
- Next[4]=Next[比较位置] +1 = 2(符合三种情况的第二种)
j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
a |
b |
a |
a |
b |
c |
a |
c |
Next[j] |
0 |
1 |
1 |
2 |
|
|
|
|
求解第五位
- 比较位置为4,可变位置为3。
- 比较位置的元素 = 可变位置的元素
- Next[5] = Next[比较位置] = Next[4](符合三种情况的第一种)
j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
a |
b |
a |
a |
b |
c |
a |
c |
Next[j] |
0 |
1 |
1 |
2 |
2 |
|
|
|
求解第六位
- 比较位置为5,可变位置4。
- 比较位置上的元素 ≠ 可变位置上的元素
- 可变位置 = Next[原来可变位置] = Next[4] = 2
- 比较位置的元素 = 可变位置的元素
- Next[6] = Next[比较位置] = Next[5]+1 = 3(符合三种情况的第二种)
j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
a |
b |
a |
a |
b |
c |
a |
c |
Next[j] |
0 |
1 |
1 |
2 |
2 |
3 |
|
|
求解第七位
- 比较位置为6,可变位置为5。
- 比较位置上的元素 ≠ 可变位置上的元素
- 可变位置 = Next[原来可变位置] = Next[5] = 2
- 比较位置上的元素 ≠ 可变位置上的元素
- 可变位置 = Next[原来可变位置] = Next[2] = 1
- 比较位置的元素 ≠ 可变位置的元素
- 可变位置 = Next[原来可变位置] = Next[1] = 0
- Next[7] = 1(符合三种情况的第三种)
j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
a |
b |
a |
a |
b |
c |
a |
c |
Next[j] |
0 |
1 |
1 |
2 |
2 |
3 |
1 |
|
求解第八位
- 比较位置为7,可变位置为6。
- 比较位置上的元素 ≠ 可变位置上的元素
- 可变位置 = Next[原来可变位置] = Next[6] = 3
- 比较位置的元素 = 可变位置的元素
- Next[8] = 比较位置的Next[7]+1 = 2(符合三种情况的第二种)
j |
1 |
2 |
3 |
4 |
5 |
6 |
7 |
8 |
|
a |
b |
a |
a |
b |
c |
a |
c |
Next[j] |
0 |
1 |
1 |
2 |
2 |
3 |
1 |
2 |