《KMP 字符串模式匹配算法》教学课例

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《KMP字符串模式匹配算法》教学课例

程玉胜

安庆师范学院计算机与信息学院

KMP字符串模式匹配是数据结构课程中一个重要的知识点,也是一个难点(学过KMP 算法的同学100%认为:KMP是数据结构课程中最难的部分)。为了消除他们对KMP算法学习的恐惧心理,激发他们的学习兴趣,调动其积极性,显得尤为重要。

基于以上,我们根据学生的认知特点和接受水平,对教材内容进行了重新构建,并按照数据结构中“时间复杂度”概念,增加了不同模式匹配算法的运行时间,动态逼真的显示了算法的“时间”性能,获得了较好的教学效果。

一、教学目标

知识目标:让学生了解KMP算法应用的普遍性。如:在目前众多的文字处理软件中得到广泛应用,如Microsoft Word中的“查找”或“替换”操作。而这种操作实现的机制,同学们特别是计算机专业的学生很少去想过。

能力目标:要求学生体验一个完整的抽象数据类型(ADT)的实现方法和过程,并学会判断、计算算法优劣的方法。

价值目标:消除恐怖的学习心态,让学生感悟数据结构算法实际应用价值,从而激发学习的兴趣,形成积极主动式学习的态度。

二、教材分析

使用教材是清华大学严蔚敏教授并由清华大学出版社出版的《数据结构(C语言版)》,该教材难度较大,其实验方法特别是ADT方法在教材中介绍较少,而且KMP算法更是从

理论分析的角度介绍了匹配算法和next的计算,自学难度很大;虽然该节知识点属于“**(表示难度较大,可以不讲)”,但是其又是考研的一个热点,所以我们又不得不讲。

三、教学重点、难点

教学重点:KMP算法中的next和改进的nextval计算

教学难点:KMP算法中如何计算next值

四、教具准备

卡片:多个字符串,字符串指针

强力磁吸:6个

五、互动式教学过程

教学

内容

教师活动学生活动目标状态

创设情境引入课题

目前的众多软件中,“查

找”、“替换”等操作实现

方法,要求学生举例。

给出一篇word文档

完成在上述文档中从当前位置向后查找

“计算机”或者向前查找“计算机”字符串

的方法。

这些软件中“查找”操作是

怎么实现的?

提出问题

教师给出如下任务:手

动演示如下两个字符串的查

找操作。

例如:在串S=”

abcabcabdabba”中查找T=”

abcabd”的位置。

学生分组讨论,演示“查找”过程,如图

(教具演示)

我们发现比较到S[6] 和T[6]不

等时,怎么办?

解决问题| 简单匹配算法引入“简单匹配算法”

给出上例的匹配过程前两

步:

第一趟、

第二趟、

学生完成匹配后面过程

第三趟、

第四趟、

要求学生计算匹配次数:通过4次匹配,

终于在S串中“查找”到T串,位置时4

在第一趟比较后,进行的第

二趟、第三趟比较有必要吗?

进一步提出问题

第一趟后,当S[6]≠T[6]

时,

◆第二趟进行S[2]与T[1]

比较是必要的吗?

◆第三趟进行S[3]与T[1]

比较是必要的吗?

◆第四趟进行S[4]与T[1]

比较是必要的吗?

◆第四趟进行S[4]与T[2]

比较是必要的吗?

学生讨论,然后找学生提问,最后证明。

如果是不必要的,那么第一

趟后,当S[6]≠T[6]时,

S[6]与T[ ]比较是必要

的呢!“”怎么求?

解决问题| KMP 匹配算法

引入“MP匹配算法”

第一趟,当S[6]≠T[6]时,

S下标不是回溯到2,T下标

也不是回溯到开始,而是根

据T中T[6]==’d’的模式

函数值(next[6]=3,为什么?

后面讲)进行匹配,要求学

生完成匹配过程

当S[6]≠T[6]时,根据next[6]=3匹配过程:

要求学生计算匹配次数:仅通过2次匹

配,终于在S串中“查找”到T串,位置时

4

next[6]=3含义:

其实这个3表示T[6]==’d’

的前面有2个字符和开始的两个

字符相同”

怎么求串的模式值

next[n]?

教学重点

内容| next 值的计算

引入“模式值next[n]的

计算”

定义:略

例二、求T=“abcab”的模式函数的值。

下标 1 2 3 4 5

T a b c a b

next 0 1 1 1 2

设T=“abcab”,S=

“abcadcabcab”,利用KMP算

法进行匹配,几次匹配成功?存

在什么问题?

问题的进一步提出第一趟:

当出现S[5]≠T[5]时,根

据next[5]=2,得:

第二趟、

第三趟、

学生完成后面的工作:

要求学生计算匹配次数:仅通过5次匹

配,在S串中“查找”到T串,位置时7

比如:“abcab”模式串中,

NEXT值为(0 1 1 1 2 )。当比较

到T[5]=b不成功时,原NEXT

的值跟T[2]比较,可事实上,T[2]

也是b,与T[5]相同,所以可以

直接跟T[1]比较。

可见,第二趟比较是多余的,

那么如何改进呢?

教学重点内容|

next[n]改进为

nextval[n]:

如果T[j]≠T[k],

k=next[j] 否则k=next[k]

要求学生计算nextval值

下标 1 2 3 4 5

T a b c a c

next 0 1 1 1 2

完成理论教学目标,那么在

计算机中我们怎样编程实现?

另外几种算法的时间复杂度怎

样计算?

相关文档
最新文档