KMP算法之next函数值序列求解法

目录

一、前言

二、KMP算法

三、试题

四、解题方法


一、前言

在最近做软考题的时候用到了KMP算法的题,刚开始感觉很难,不会做,所以在网上查了很多方法,在查的过程中发现了一个很高效的方法,分享给需要的人。

二、KMP算法

KMP算法是一种改的字符串匹配算法,由D.E.Knuth,J.H.Morris和V.R.Pratt同时发现,因此人们称它为克努特——莫里斯——普拉特操作(简称KMP算法)。KMP算法的关键是利用匹配失败后的信息,尽量减少模式串与主串的匹配次数以达到快速匹配的目的。具体实现就是实现一个next()函数,函数本身包含了模式串的局部匹配信息。时间复杂度O(m+n)。

大多数据结构课本中,串涉及的内容即串的模式匹配,需要掌握的是朴素算法、KMP算法及next值的求法。

三、试题

1.试题

在KMP模式匹配算法中,需要求解模式串p的next函数值,其定义如下(其中,j 是字符在模式串中的序号)。对于模式串“abaabaca”,求其next函数值序列。

此题是一道软考题,我们就以这道题为例看看他们解法。

2.公式

四、解题方法

1.先将这个字符串写出来。

a

 b

a

a

 b

a

c

 a

2.写出这些字符串前缀式和后缀式,当他们前缀和后缀一样的数有几个就写几个,没有就写0.

从以上图可以看出,将他们相同的字母找出来了,有相同的用直线表示,不相同的用0表示,这些也是求出来的最长串的数字。

3.为这些字符串标下标。

1

2

3

4

5

6

7

8

a

 b

a

a

 b

a

c

 a

 

4.接下来就是就要把上图中求出来的最长串的数字写在这个模式串下面。此时下面这一串数字并不是我们所要求的next函数值序列

0

0

1

1

2

3

0

1

 

5.接下来就是最重要的部分了。将求出来的最长串数字复制到模式串下面。

1

2

3

4

5

6

7

8

a

 b

a

a

 b

a

c

 a

0

0

1

1

2

3

0

1

然后去掉最后一个值。去掉之后就剩00112301了。

6.接下来在在开头加上一个-1,将整个数字序列后移一位,得到得值如下表格。

1

2

3

4

5

6

7

8

a

 b

a

a

 b

a

c

 a

-1

0

0

1

1

2

3

0

7.此时也是最后一步了,每个值+1

1

2

3

4

5

6

7

8

a

 b

a

a

 b

a

c

 a

0

1

1

2

2

3

4

1

到这里就完成整个题的解了,感觉这中方法挺高效的,我也是刚开始学习,如果有错还请指出,进行改进。在这里就只是说了一下next函数值序列的求解法,具体的思想和方法就不说了,此方法只适合简单的做题

发布了137 篇原创文章 · 获赞 55 · 访问量 16万+

猜你喜欢

转载自blog.csdn.net/yyp0304Devin/article/details/89853300
今日推荐