模式匹配的KMP算法

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

模式匹配的KMP算法

学生姓名:侯成龙指导老师:罗心

摘要本课程设计主要解决用模式匹配的KMP算法进行字串定位的程序设计。在本课程设计中,系统开发平台为Windows XP,程序设计设计语言采用Visual C++6.0,程序运行平台为Windows 98/2000/XP。在程序设计中,采用了串的KMP模式匹配算法实现了子串的定位操作。程序通过调试运行,初步实现了设计目标,并且经过适当完善后,将可以解决实际问题。

关键词程序设计;串的模式匹配;KMP算法;Visual C++6.0

1 引言

子串定位运算通常称为串的模式匹配或串匹配运算,是串处理中最重要的运算之一,应用非常广泛[1]。本课程设计主要解决用模式匹配的KMP算法进行字串定位的程序设计。

1.1 课题背景

计算机上的非数值处理的对象基本上是字符串数据。在较早的程序设计语言中,字符串是作为输入和输出的常量出现的。随着语言加工程序的发展,产生了字符串处理。这样,字符串也就作为一种变量类型出现在越来越多的程序设计语言中,同时也产生了一系列字符串的操作。字符串一般简称为串。在汇编和语言的编译程序中,源程序及目标程序都是字符串数据。在事务处理程序中,顾客的姓名和地址以及货物的名称、产地和规格等一般也是作为字符串处理的。又如信息检索系统、文字编辑程序、问答系统、自然语言翻译系统以及音乐分析程序等,都是以字符串数据作为处理对象的[2]。

数据结构是指相互之间存在一定关系的数据元素的集合。按照视点的不同,数据结构分为逻辑结构和存储结构。数据的逻辑结构(logical structure)是指数据元素之间逻辑关系的整体。所谓逻辑关系是指数据元素之间的关联方式或邻接关系。根据数据元素之间逻辑关系的不同,数据结构分为四类:集合;线性结构;树结构;图结构。数据的逻辑结构属于

用户视图,是面向问题的,反映了数据内部的构成方式。为了区别于数据的存储结构,常常将数据的逻辑结构称为数据结构。数据的存储结构(storage structure)又称为物理结构,是数据及其逻辑结构在计算机中的表示,换言之,存储结构除了数据元素之外,必须隐式或显示地存储数据元素之间的逻辑关系。通常有两种存储结构:顺序存储结构和链接存储结构[3]。

串(string)(或字符串)是由零个或多个字符组成的有限序列,一般记为s ='a1a2…an'(n>=0)。其中,s是串的名,用单引号括起来的字符序列是串的值;ai可以是字母、数字或其他字符;串中字符的数目n称为串的长度。零个字符的串称为空串,他的长度为零。串中任意个连续的字符组成的子序列称为该串的子串。包含子串的串相应的称为主串。通常称字符在序列中的序号为该字符串在串中的位置。子串在主串中的位置则以子串的第一个字符在主串中的位置来表示。

类似于线性表的顺序存储结构,用一组地址连续的存储单元存储串值的字符序列。在串的定长顺序存储结构中,按照预定义的大小,为每个定义的串变量分配一个固定长度的存储区,则可以用定长数组来描述之。

子串定位运算通常称为串的模式匹配或串匹配运算,是串处理中最重要的运算之一,应用非常广泛。例如,在文本编辑程序中,我们经常要查找某个特定单词在文本中出现的位置。显然解决该问题的有效算法能极大地提高文本编辑程序的响应性能[4]。

在计算机科学领域,串的模式匹配算法一直都是研究焦点之一。串匹配从方式上可分为精确匹配、模糊匹配、并行匹配等,KMP算法是字符串查找算法中的一个经典算法,该算法在最坏情况下具有线性的查找时间,查找效率高[5]。

1.2 课程设计目的

子串定位就是要在主串s中找到一个与子串t相同的子串。通常我们把主串s称为目标串,把子串t称为模式串,把从目标串s中查找t子串的定位过程称为串的“模式匹配”。模式匹配有两种结果:若从主串s中找到模式为t的子串,则返回t子串在s中的起始位置。当s中有多个模式匹配为t的子串时,通常只找出第一个子串的起始位置,这种情况称为匹配成功,否则称为匹配失败[6]。

本课程设计主要是用模式匹配的KMP算法实现子串的定位操作,通过程序的编写、调试和运行可以进一步掌握数据结构及算法的程序实现的基本方法。理解子串定位操作的实现过程以及KMP算法对基本模式匹配算法的改进之处。

1.3课程设计内容

本课程设计主要完成改进基本的模式匹配算法,运用KMP算法实现串的模式匹配的程序设计。例如,运行改进后程序时,输入主串s=“addabbcgsa”,模式串t=“abbc”时,显示模式匹配成功,模式串在主串的位置从第4个字符开始;如果输入输入主串s=“addabbcgsa”,模式串t=“absc”时,则显示模式匹配不成功,在主串中未找到模式串。

2 设计思路与方案

2.1设计思路

注意到模式匹配的KMP算法是对模式匹配简单算法改进后的算法,所以有必要先介绍简单模式匹配算法及其基本思想,进而提出一种改进后的模式匹配算法---KMP算法。因为KMP算法是在已知模式串的next函数值的基础上执行的,所以又要先实现求模式串next 函数值的算法。

2.2设计方案

在本课程设计中,运用串的模式匹配的KMP算法进行子串的定位操作,要实现这一过程主要用到以下函数:

求next函数值的算法:

void GetNext(char T[MAXSTRLEN],int (&next)[64])

计算next函数修正值的算法:

void GetNextVal(char T[MAXSTRLEN],int (&next)[64])

KMP算法:

int IndexKMP(char S[MAXSTRLEN],char T[MAXSTRLEN],int (&next)[64],int pos) 主函数:

void main()

3 详细实现

3.1模式匹配的基本算法

采用定长顺序存储结构,可以写出不依赖于其他串操作的基本匹配算法。该算法的基本思想是:从主串S的第pos个字符起和模式的第一个字符比较之,若相等,则继续逐个

相关文档
最新文档