数据结构:关于KMP算法中Next[]数组的求法

写在前面:

这只是博主自己的理解,没有什么纯理论的东西。博主尽可能的将如何得到Next[]数组的过程口语化,用最简单的方法求解。其中一定有不严谨的地方,敬请谅解。

求Next[] 数组值过程中可能出现的三种情况

  1. 一次比较就相同。(此时求解的Next[ ]值等于比较位置上的Next[ ]值)
  2. 在比较过程中得到相同元素。(此时求解的Next[ ]值等于比较位置上的Next[ ]值+1)
  3. 比较到最后仍得不到相同元素,即当可变位置为0时。(此时求解的Next[ ]值等于1)

求解过程

例:

j 1 2 3 4 5 6 7 8
a b a a b c a c
Next[j] 0 1

首先将第一位和第二位分别置01
我们引进两个位置概念(这两者都是坐标概念)。
比较位置(即当前所求值元素的前一个元素的坐标)。
可变位置(比较位置的前一个位置坐标,随着比较过程的进行,这个坐标会变化)

求解第三位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
发布了7 篇原创文章 · 获赞 0 · 访问量 449

猜你喜欢

转载自blog.csdn.net/qq_44147512/article/details/103498295