串的模式匹配

合集下载

串的模式匹配算法

串的模式匹配算法

串(String)又叫做字符串,是一种特殊的线性表的结构,表中每一个元素仅由一个字符组成。随着计算机的发展,串在文字编辑、词法扫描、符号处理以及定理证明等诸多领域已经得到了越来越广泛的应用。

第一节串的定义和表示

1、串的逻辑结构定义

串是由零个到任意多个字符组成的一个字符序列。一般记为:

S=’ a1a2a3……a n’(n>=0)

其中S为串名,序列a1a2a3……a n为串值,n称为串的长度,我们将n=0的串称为空串(null string)。

串中任意一段连续的字符组成的子序列我们称之为该串的子串,字符在序列中的序号称为该字符在串中的位置。

在描述中,为了区分空串和空格串(s=‘’),我们一般采用来表示空串。

2、串的基本操作

串一般包含以下几种基本的常用操作:

1、length(S),求S串的长度。

2、delete(S,I,L),将S串从第I位开始删除L位。

3、insert(S,I,T),在S的第I位之前插入串T。

4、str(N,S),将数字N转化为串S。

5、val(S,N,K),将串S转化为数字N;K的作用是当S中含有不为数字的字符时,K

记录下其位置,并且S没有被转化为N。

3、串的储存结构

一般我们采用以下两种方式保存一个串:

1、字符串类型,描述为:

const n=串的最大长度

type strtype=string[n]

这里由于tp的限制,n只能为[1..255]。在fp或者delphi中,我们还可以使用另外一种类型,描述为:

const n=串的最大长度

type strtype=qstring[n]

常见5种基本匹配算法

常见5种基本匹配算法

常见5种基本匹配算法

匹配算法在计算机科学和信息检索领域广泛应用,用于确定两个或多

个对象之间的相似度或一致性。以下是常见的5种基本匹配算法:

1.精确匹配算法:

精确匹配算法用于确定两个对象是否完全相同。它比较两个对象的每

个字符、字节或元素,如果它们在相同位置上完全匹配,则返回匹配结果

为真。精确匹配算法适用于需要确定两个对象是否完全相同的场景,例如

字符串匹配、图像匹配等。

2.模式匹配算法:

模式匹配算法用于确定一个模式字符串是否出现在一个文本字符串中。常见的模式匹配算法有暴力法、KMP算法、BM算法等。暴力法是最简单的

模式匹配算法,它按顺序比较模式字符串和文本字符串的每个字符,直到

找到一次完全匹配或结束。KMP算法通过预处理建立一个跳转表来快速定

位比较的位置,减少了无效比较的次数。BM算法利用模式串的后缀和模

式串的字符不完全匹配时在文本串中平移模式串的位置,从而快速定位比

较的位置。

3.近似匹配算法:

4.模糊匹配算法:

5.哈希匹配算法:

哈希匹配算法用于确定两个对象之间的哈希值是否相等。哈希值是通

过将对象映射到一个固定长度的字符串来表示的,相同的对象会产生相同

的哈希值。常见的哈希匹配算法有MD5算法、SHA算法等。哈希匹配算法

适用于需要快速判断两个对象是否相等的场景,例如文件的完整性校验、

数据校验等。

以上是常见的5种基本匹配算法,它们各自适用于不同的场景和需求,选择合适的匹配算法可以提高效率和准确性,并且在实际应用中经常会结

合多种算法来获取更好的匹配结果。

串的模式匹配算法

串的模式匹配算法

串的模式匹配算法

字符串模式匹配是计算机科学中一种常用的算法。它是一种检索字符串中特定模式的技术,可以用来在字符串中查找相应的模式,进而完成相应的任务。

字符串模式匹配的基本思想是,用一个模式串pattern去

匹配另一个主串text,如果在text中找到和pattern完全匹配的子串,则该子串就是pattern的匹配串。字符串模式匹配的过

程就是在text中搜索所有可能的子串,然后比较它们是否和pattern完全匹配。

字符串模式匹配的算法有很多,其中著名的有暴力匹配算法、KMP算法、BM算法和Sunday算法等。

暴力匹配算法是最简单也是最常用的字符串模式匹配算法,其思想是从主串的某一位置开始,依次比较pattern中每一个

字符,如果某个字符不匹配,则从主串的下一位置重新开始匹配。

KMP算法(Knuth-Morris-Pratt算法)是一种更为高效的

字符串模式匹配算法,它的特点是利用了已匹配过的字符的信息,使搜索更加有效。它的实现思想是,在pattern中先建立

一个next数组,next数组的值代表pattern中每个字符前面的

字符串的最大公共前缀和最大公共后缀的长度,这样可以在主

串和模式串匹配失败时,利用next数组跳转到更有可能匹配

成功的位置继续搜索,从而提高字符串模式匹配的效率。

BM算法(Boyer-Moore算法)也是一种高效的字符串模

式匹配算法,它的实现思想是利用主串中每个字符最后出现的位置信息,以及模式串中每个字符最右出现的位置信息来跳转搜索,从而减少不必要的比较次数,提高搜索效率。

多模式串匹配算法详解

多模式串匹配算法详解

多模式串匹配算法详解

随着计算机技术的不断发展,我们的生活已经离不开计算机了。计算机技术也在不断完善和发展,其中算法是计算机科学的基础

之一。在计算机科学中,字符串匹配是一个非常重要的问题,而

多模式串匹配算法就是解决字符串匹配问题的一种方法。

一、什么是多模式串匹配算法

多模式串匹配算法是指在一个文本串中查找多个模式串的匹配

位置。举个例子,如果我们想在一段英文文章中查找“apple”、“banana”和“pear”这三个单词的位置,那么就可以使用多模式串匹

配算法。在这个例子中,文本串就是整篇文章,而“apple”、“banana”和“pear”就是模式串。

二、常见的多模式串匹配算法

1.基于Trie树的多模式串匹配

Trie树是一种树形数据结构,它是一种有序树,用于保存关联

数组,其中键通常是字符串。Trie树的基本思想是将字符串拆分

成单个字符,然后构建一棵树,使得每个节点代表一个字符,从根节点到叶子节点组成的字符串就是一个完整单词。构建出Trie 树之后,就可以使用类似深度优先搜索的方法,在Trie树上查找所有匹配的字符串。

2.基于AC自动机的多模式串匹配

AC自动机是一种自动机算法,它是基于Trie树的改进。AC自动机可以在O(n)的时间复杂度内找出文本串中所有出现在模式串集合中的模式串出现的位置。就算是在模式串集合非常大的情况下,AC自动机依然可以保持良好的时间复杂度。所以AC自动机是一种非常高效的多模式串匹配算法。

三、多模式串匹配算法的应用

多模式串匹配算法的应用非常广泛,下面列举一些常见的应用场景。

串的两种模式匹配算法

串的两种模式匹配算法

串的两种模式匹配算法

模式匹配(模范匹配):⼦串在主串中的定位称为模式匹配或串匹配(字符串匹配) 。模式匹配成功是指在主串S中能够找到模式串T,否则,称模式串T在主串S中不存在。

以下介绍两种常见的模式匹配算法:

1. Brute-Force模式匹配算法暴风算法,⼜称暴⼒算法。

算法的核⼼思想如下:

设S为⽬标串,T为模式串,且不妨设:

S=“s0s1s2…sn-1” , T=“t0t1t2 …tm-1”

串的匹配实际上是对合法的位置0≦i≦n-m依次将⽬标串中的⼦串s[i…i+m-1]和模式串t[0…m-1]进⾏⽐较:

若s[i…i+m-1]=t[0…m-1]:则称从位置i开始的匹配成功,亦称模式t在⽬标s中出现;

若s[i…i+m-1]≠t[0…m-1]:从i开始的匹配失败。位置i称为位移,当s[i…i+m-1]=t[0…m-1]时,i称为有效位移;当s[i…i+m-1] ≠t[0…m-1]时,i称为⽆效位移。

算法实现如下:

(笔者偷懒,⽤C#实现,实际上C# String类型已经封装实现了该功能)

1public static Int32 IndexOf(String parentStr, String childStr)

2 {

3 Int32 result = -1;

4try

5 {

6if (parentStr.Length > 1 && childStr.Length > 1)

7 {

8 Int32 i = 0;

9 Int32 j = 0;

10while (i < parentStr.Length && j < childStr.Length)

串的模式匹配算法

串的模式匹配算法

反复执行匹配步骤,直到出现下面两种情 况之一:或者在某一趟匹配中出现t1=sim+1,t2=si-m+2,…,tm=si,那么 匹配成功,返回序号i-m+1;或者如果执 行(n-m+1)次匹配步骤之后,即一直将T 向右移到无法继续与S比较为止,在S中没 有找到等于T的子串,那么匹配失败。
S T
S T
a c b a c ba b ca
a c ba b
j=2
j=6
. 改进的模式匹配算法匹配过程
在匹配改进算法,需要解决的关键问题:当匹配过 程中某次比较不成功时,模式串向右滑动的距离是多 少,以及下次比较时j指针的值,即主串中第i个字符 应该与模式串中哪个字符再比较?
令next[j] = k,则next[j]表示当模式串中第j个字 符与主串第i个字符不等时,模式串中需要重新与主串 字符si进行比较的位置。
/* 在目标串s中找模式串t首次出现的位置,若不存在返回0。采用定长顺序
存储结构第二种方式存放串S和串T */
{
int i,j;
for(i=1,j=1;i<=s.length&&j<=t.length;)
{if(s.ch[i-1]==t.ch[j-1])
{i++;j++;}
/*字符比较成功,继续比较后续字符*/

知识点串的模式匹配

知识点串的模式匹配
2020/8/20
p79算法4.5
int Index (SString S, SString T, int pos) { // 返回子串T在主串S中第pos个字符之后的位置。若不存在,
// 则函数值为0。其中,T非空,1≤pos≤StrLength(S)。 i = pos; j = 1; while (i <= S[0] && j <= T[0]) { if (S[i] == T[j]) { ++i; ++j; } // 继续比较后继字符 else { i = i-j+2; j = 1; } // 指针后退重新开始匹配 } if (j > T[0]) return i-T[0]; else return 0; } // 2In0d2e0x/8/20
• 4. 3 串的模式匹配算法( 知识点三) • 子串定位运算又称为模式匹配或串匹配,此运算的应
用非常广泛。例如,文本编辑程序中,经常要查找某 一特定单词出现的位置。解此问题的有效算法能极大 地提高文本编辑程序的响应性能。 串的模式匹配定义:在主串中寻找子串在串中的位置。 在模式匹配中,子串称为模式串,主串称为目标串。
Pj-1
当 si ≠ pj失匹时
2020/8/20
小结-2
关注部分匹配时的重要特征——
i
S="ap=b"aa

KMP

KMP

KMP算法
j 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 模式串 a b c a a b b c a b c a a b d a b next[j] 0 1 1 1 2 2 3 1 1 2 3 4 5 6 7 1 2
nextval[j]
0 1 1 0 2 1 3 1 0 1 1 0 2 1 7 0 1
‖ ‖ ‖ ‖ ‖ ‖ ≠
p1
p2 … pj-2 pj-1 pj pj+1 p1 … pk-1 pk pk+1
① "p1p2…pk-1" = "si-k+1si-k+2…si-1" ②"pj-k+1pj-k+2…pj-1" = "si-k+1si-k+2…si-1"(部分匹配) 真子串) ③ "p1p2…pk-1" = "pj-k+1pj-k+2…pj-1" (真子串) 真子串
KMP算法
串的模式匹配算法 1. 朴素模式匹配算法(Brute-Force算法 朴素模式匹配算法 算法) 算法 求子串位置的定位函数Index( S, T, pos). 求子串位置的定位函数 模式匹配:子串的定位操作通常称作串的模式匹配. 模式匹配:子串的定位操作通常称作串的模式匹配. 目标串:主串S. 目标串:主串 . 模式串:子串T. 模式串:子串 . 匹配成功:若存在T的每个字符依次和 的每个字符依次和S中的一个连 匹配成功:若存在 的每个字符依次和 中的一个连 续字符序列相等,则称匹配成功.返回T中第一个字符 续字符序列相等,则称匹配成功.返回 中第一个字符 中的位置. 在S中的位置. 中的位置 匹配不成功:返回0. 匹配不成功:返回 .

串的模式匹配算法

串的模式匹配算法

第一次匹配 s= c d d c d c t= c d c
第二次匹配 s= c d d c d c t= c d c
第三次匹配 s= c d d c d c t= c d c
第四次匹配 s= c d d c d c t= c d c
i=2 j=2 i=1 j=0 i=2 j=0 i=5 j=2
失败 失败 失败 成功
2、KMP算法
KMP算法是在Brute Force算法的基础上的模式匹配的改进算法。KMP算法 的特点主要是消除了Brute-Force算法的如下缺点: 主串下标i在若干个字符序列 比较相等后,只要有一个字符比较不相等便需要把下标i的值回退。分两种情况分 析Brute-Force算法的匹配过程:
第一种情况是模式串中无真子串, 如下图的主串s=“cddcdc”、模式串 t=“cdc”的模式匹配过程。当s0=t0,s1=t1,s2≠t2时,算法中取i=1,j=0,使 主串下标i值回退,然后比较s1和t0。但是因t1≠t0,所以一定有s1≠t0,实际上接 下来就可直接比较s2和t0。
最好的情况是:一配就中!主串的前m个字符刚好等于模式串 的 m个字符,只比较了m次,时间复杂度为O(m)。
最恶劣情况是:模式串的前m-1个字符序列与主串的相应字符序 列比较总是相等,但模式串的第m个字符和主串的相应字符 比较总是不等,此时模式串的m个字符序列必须和主串的相 应字符序列块一共比较n-m+1,所以总次数为:m*(n-m+1), 因此其时间复杂度为O(n×m)。

C语言中的模式匹配算法

C语言中的模式匹配算法

C语言中的模式匹配算法

在计算机科学中,模式匹配是一种非常重要的算法,它可以用于文

本匹配、字符串匹配、图形识别等领域。在C语言中,有多种模式匹

配算法可以用于实现字符串匹配操作。本文将介绍C语言中的一些常

用模式匹配算法,包括Brute-Force算法、Knuth-Morris-Pratt(KMP)算

法和Boyer-Moore算法。

一、Brute-Force算法

Brute-Force算法,也称为朴素模式匹配算法,是最简单直接的一种

算法。它的思想是从目标字符串的第一个字符开始,依次和模式字符

串对应位置的字符比较,如果出现不匹配的字符,则将目标字符串的

指针向后移动一位,再次进行比较,直到找到匹配的子串或遍历完整

个目标字符串。

Brute-Force算法的时间复杂度为O(m*n),其中m为目标字符串的

长度,n为模式字符串的长度。该算法简单易懂,但对于较长的字符串

匹配操作效率较低。

二、Knuth-Morris-Pratt(KMP)算法

KMP算法是一种优化的字符串模式匹配算法,它利用了模式字符

串中的信息来避免不必要的比较。该算法的核心思想是,当模式字符

串中的某一部分与目标字符串不匹配时,不需要将目标字符串的指针

回溯到上一次比较的位置,而是利用已有的信息直接跳过一部分字符,从而提高了匹配的效率。

KMP算法的时间复杂度为O(m+n),其中m为目标字符串的长度,n为模式字符串的长度。相较于Brute-Force算法,KMP算法在处理较长字符串时能够明显提高匹配速度。

三、Boyer-Moore算法

Boyer-Moore算法是一种更加高效的字符串模式匹配算法,它充分利用了模式字符串中的信息进行跳跃式匹配。该算法的核心思想包括两个关键步骤:坏字符规则和好后缀规则。

简述串的模式匹配算法概念

简述串的模式匹配算法概念

简述串的模式匹配算法概念

串的模式匹配算法是指在一个较长的字符串中寻找一个较短的模式字符串是否出现的一种算法。常见的串的模式匹配算法包括朴素模式匹配算法、KMP算法、Boyer-Moore算法和Rabin-Karp算法等。

朴素模式匹配算法是一种简单的模式匹配算法,它从主串的第一个字符开始逐个字符与模式串进行比较,如果发现不匹配,则主串的比较位置向后移动一位,并重新与模式串的第一个字符进行比较。这个过程一直重复直到找到匹配的位置或主串遍历完毕。

KMP算法是一种高效的模式匹配算法,它利用模式串中的重复信息避免无效的比较。KMP算法先对模式串进行预处理,生成一个部分匹配表(即next数组),然后根据该表的信息进行匹配。当发生不匹配时,KMP算法通过查找部分匹配表中的值来决定模式串的移动位置,从而避免了不必要的比较操作,提高匹配的效率。

Boyer-Moore算法是一种更加高效的模式匹配算法,它利用了模式串中的字符出现位置进行快速的移动。Boyer-Moore算法从主串的末尾开始比较,遇到不匹配的字符时,根据模式串中的字符出现位置,选择合适的位移量进行移动。这样可以快速地将模式串与主串对齐,减少不必要的比较次数。

Rabin-Karp算法是一种基于哈希的模式匹配算法,它利用哈希函数对子串进行哈希运算,并与模式串的哈希值进行比较,从

而确定是否匹配。Rabin-Karp算法通过将字符串转化为数值进行比较,避免了字符比较的开销,提高了匹配的效率。但是Rabin-Karp算法可能出现哈希冲突的情况,需要额外的处理。

串的模式匹配

串的模式匹配

串的模式匹配

(1)、Brute-Force

暴风(Brute Force)算法是普通的模式匹配算法,BF算法的思想就是将⽬标串S的第⼀个字符与模式串T的第⼀个字符进⾏匹配,若相等,则继续⽐较S的第⼆个字符和 T的第⼆个字符;若不相等,则⽐较S的第⼆个字符和T的第⼀个字符,依次⽐较下去,直到得出最后的匹配结果。BF算法是⼀种蛮⼒算法。

如⽬标串:"caatcat",t="cat",pos=1,匹配过程如图

程序如下:

#include<stdio.h>

#include<stdlib.h>

#define MAXNUM 100

//顺序串的存储结构,即串中的字符被依次存放在⼀组连续的存储单元中

typedef struct St

{

char *ch; //存放串的起始地址,串中的第i个元素存储在ch[i-1]中

int length; //串的长度

int strsize;//分配给串的存储空间⼤⼩,若不够,通过realloc()再分配,增加存储空间

}String;

String CreateNullString()

{

String s;

s.ch=(char *)malloc(MAXNUM*sizeof(char)); //初始化串的存储空间

s.length=0;

s.strsize=MAXNUM;

return s;

}

//为字符串赋值

void Stringassign(String *s,char s2[])

{

int i=0;

//统计串s2的长度,若不够,然后再通过realloc去增加存储空间

串的匹配模式

串的匹配模式

KMP算法实现
s
match[p-1]
p
Position KMP( char *string, char *pattern ) { int n = strlen(string);
int m = strlen(pattern); int s, p, *match;
match = (int *)malloc(sizeof(int) *ห้องสมุดไป่ตู้m); BuildMatch(pattern, match); s = p = 0; while (s<n && p<m) {
char pattern[] = "simple"; Position p = strstr(string, pattern); printf("%s\n", p); return 0; }
简单实现
方法1:C的库函数 strstr
char *strstr(char *string, char *pattern)
match[ ? ]
?
match[ j–1]
j–1
?
j
BuildMatch 的实现
void BuildMatch(char *pattern, int *match)
{ int i, j;
i
j
int m = strlen(pattern);

数据结构—串的模式匹配

数据结构—串的模式匹配

实验一串的模式匹配

1.程序设计简介

为简化设计,程序直接利用C++字符数组作为串的存储结构。程序提供显示串(包含主串和模式串)、计算Next[]、BF匹配、KMP匹配、重建主串、重建模式串等功能。

2. 源代码

//串模式匹配的类定义FindSub.cpp

#include

#include

#include

#include

#include

const maxsize=30;

int IndexBF(char s[],char t[],int pos)

{int i,j,m,n;

i=pos-1;j=0;

m=strlen(s);

n=strlen(t);

while(i

{if(s[i]==t[j])

{++i;++j;}

else {i=i-j+1;j=0;}

}

if(j>=n)

return i-n+1;

else

return -1;

}

void GetNext(char t[],int next[])

{// 求模式串T的next函数值并存入数组next

int j=0,k=-1;

int n=strlen(t);

next[j]=-1;

while(j

{

if(k==-1||t[j]==t[k])

{j++;k++;next[j]=k;}

else k=next[k];

}

}

int IndexKMP(char s[],char t[],int next[],int pos)

{// 利用模式串T的next函数求T在主串S中第pos个字符之后的位置的KMP算法。

// 其中,T非空,1≤pos≤StrLength(S)

int i,j,n;

B F 算 法 ( 详 解 )

B F 算 法 ( 详 解 )

BF算法(串模式匹配算法)C语言详解

串的模式匹配算法,通俗地理解,是一种用来判断两个串之间是否具有"主串与子串"关系的算法。

主串与子串:如果串 A(如 "shujujiegou")中包含有串 B(如"ju"),则称串 A 为主串,串 B 为子串。主串与子串之间的关系可简单理解为一个串 "包含" 另一个串的关系。

实现串的模式匹配的算法主要有以下两种:

普通的模式匹配算法;

快速模式匹配算法;

本节,先来学习普通模式匹配(BF)算法的实现。

BF算法原理

普通模式匹配算法,其实现过程没有任何技巧,就是简单粗暴地拿一个串同另一个串中的字符一一比对,得到最终结果。

例如,使用普通模式匹配算法判断串 A("abcac")是否为串 B ("ababcabacabab")子串的判断过程如下:

首先,将串 A 与串 B 的首字符对齐,然后逐个判断相对的字符是否相等,如图?1 所示:

图 1 串的第一次模式匹配示意图

图 1 中,由于串 A 与串 B 的第 3 个字符匹配失败,因此需要将串 A 后移一个字符的位置,继续同串 B 匹配,如图 2 所示:图 2 串的第二次模式匹配示意图

图 2 中可以看到,两串匹配失败,串 A 继续向后移动一个字符的位置,如图 3 所示:

图 3 串的第三次模式匹配示意图

图 3 中,两串的模式匹配失败,串 A 继续移动,一直移动至图 4 的位置才匹配成功:

图 4 串模式匹配成功示意图

由此,串 A 与串 B 以供经历了 6 次匹配的过程才成功,通过整个模式匹配的过程,证明了串 A 是串 B 的子串(串 B 是串 A 的主串)。

串的模式匹配算法

串的模式匹配算法

9
第9页,本讲稿共21页
(2) next[ j ]怎么计算? 计算Next[ j]的方法: •当j=1时,Next[ j]=0; //Next[ j]=0表示根本不进行字符比较 •当j>1时,Next[ j]的值为:模式串的位置从1到j-1构成的串 中所出现的首尾相同的子串的最大长度加1。 无首尾相同的子串时Next[ j]的值为1。
// Next[j]=1表示从模式串头部开始进行字符比较
怎样计算模式T所有可能的失配点 j 所对应的 next[j]?
10 10
第10页,本讲稿共21页
例:
模 式 串 T: a b a a b c a c 可能失配位 j: 1 2 3 4 5 6 7 8 新匹配位k=next[j] : 0 1 1 2 2 3 1 2
else return0; }//Index_KMP
15 15
第15页,本讲稿共21页
讨论: next [ j ]是否完美无缺?
前面定义的next函数在某些情况下还是有缺陷的, 例如模式aaaab与主串aaabaaaab匹配时的情况:
先计算next[j]:
j:1 2 3 4 5 T:a a a a b next[j]: 0 1 2 3 4
第二步:执行定位函数Index_kmp (与BF算法模块非常相似)
Int Index_KMP(SString S, SString T, int pos) { //见教材P82 i=pos; j=1; while ( i<=S[0] && j<=T[0] ) { if (j==0|| S[i] = = T[j] ) {++i, ++j} //不失配则继续比较后续字符 else {j=next[j];} //特点:S的i指针不回溯,而且从T的k位置开始匹配 } if(j>T[0]) return i-T[0]; //子串结束,说明匹配成功
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

《数据结构》课程设计报告

题目:模式匹配算法KMP及其应

学院

(系):

班级:

学生学

号:

姓名:

指导教

师:

日期:

目录

摘要 (1)

一、绪论 (2)

1. 课程设计的背景 (2)

2. 课程设计的意义 (3)

3. 开发平台及其简介 (3)

二、需求分析 (3)

三、可行性分析 (5)

四、概要设计

1. 功能设计要求 (5)

2. 总体结构设计 (6)

3. 抽象数据类型串的定义 (9)

4. 函数调用关系 (10)

5. 主程序调用 (11)

五、详细设计 (12)

1. 宏定义 (12)

2. 数据元素结构定义 (13)

3. 功能具体实现 (13)

4. 主程序和菜单设计 (29)

六、设计和调试分析 (31)

七、测试结果 (33)

八、设计心得体会 (37)

九、用户手册 (37)

一十、附录 (43)

一十一、参考文献 (44)

摘要

本程序主要是通过获取一个子串,或新建一个新的文本文件,或和已有的文本文件进行匹配,分别利用了串的朴素模式匹配算法、串的模式匹配KMP算法、串的模式匹配改进算法等数据结构中学的知识实现了,在和文本文件中的主串进行匹配后返回子串在文本文件中出现的次数和出现位置所在的行的行号。

本程序除了实现串在定长顺序存储结构下的三种模式匹配算法,还实现了串在单链表存储结构下的模式匹配KMP算法,通过比较了串的不同存储结构下串的模式匹配算法,进一步加强了对串的理解及串的各类模式算法的掌握。

在使用串的定长存储结构时,考虑到书本上实现串的KMP算法时,储存串的数组下标是从1开始,为了进一步理解串,本程序另辟蹊径,特地定义了一个结构体,结构体中用来存储串的数组下标是从0开始,实现了串的模式匹配KMP算法。

本程序容错性强,功能齐全。整个程序设计从用户的角度出发,把用户的需求作为本程序设计的标准,因此菜单设计非常的人性化,且界面设计优美。同时,本程序还对串的模式匹配算法可能的应用作了设想,例如串的模式匹配在串的查找与替换功能中的应用等等。

本程序安全逻辑严密,且安全系数较高,设计了登录功能,如果没有使用权限则无法使用本系统。此外,本程序的菜单设计合理,菜单功能齐全,中间合理的提示可以让用户更好更快的掌握本系统的使用。

关键字:串匹配 KMP KMP改进定长顺序存储

一、绪论

1、课程设计的背景

《数据结构》作为一门独立的课程最早是美国的一些大学开设的,1968年美国唐欧克努特教授开创了数据结构的最初体系,他所著的《计算机程序设计技巧》第一卷《基本算法》是第一本较系统地阐述数据的逻辑结构和存储结构及其操作的著作.从 60 年代末到 70 年代初,出现了大型程序,软件也相对独立, 结构程序设计成为程序设计方法学的主要内容,人们就越来越重视数据结构,认为程序设计的实质是对确定的问题选择一种好的结构,加上设计一种好的算法. 从 70 年代中期到 80 年代初,各种版本的数据结构著作就相继出现. 目前在我国,《数据结构》也已经不仅仅是计算机专业的教学计划中的核心课程之一,而且是其它非计算机专业的主要选修课程之一.

《数据结构》在计算机科学中是一门综合性的专业基础课.数据结构的研究

不仅涉及到计算机硬件 (特别是编码理论, 存储装置和存取方法等) 的研究范围, 而且和计算机软件的研究有着更密切的关系,无论是编译程序还是操作系统,都涉及到数据元素在存储器中的分配问题. 在研究信息检索时也必须考虑如何组织数据, 以便查找和存取数据元素更为方便. 因此, 可以认为数据结构是介于数学, 计

算机硬件和计算机软件三者之间的一门核心课程,在计算机科学中,数据结构不仅是一般程序设计(特别是非数值计算的程序设计)的基础,而且是设计和实现编译程序,操作系统,数据系统及其它系统程序和大型应用程序的重要基础. 值得注意的是,数据结构的发展并未终结,一方面,面向各专门领域中特殊问题的数据结构得到研究和发展,如多维图形数据结构等;另一方面,从抽象数据类型的观点来论数据结构,已成为一种新的趋势,越来越被人们所重视.

2、课程设计的意义

数据结构是一门实践性很强的学科。良好的系统设计和分析能力的培养需要

通过长期、系统的训练(包括理论和实践两方面)才能获得。高等学校的实践教学一般包括课程实验、综合性设计(课程设计)、课外科技活动、社会实践、毕业设计等,基本上可以分为三个层次:第一,是紧扣课堂教学内容,以掌握和巩固课程教学内容为主的课程实验和综合性设计;第二,是以社会体验和科学研究体验为主的社会实践和课外科技活动;第三,是以综合应用专业知识和全面检验专业知识应用能力的毕业设计。课程实践(含课程实验和课程设计)是大学教育中最重要也最基础的实践环节,直接影响后继课程的学习以及后继实践的质量。由于课程设计是以培养学生的系统设计与分析能力为目标,通过团队式合作、研究式分析、工程化设计完成较大型系统或软件的设计题目的,因此课程设计不仅有利于学生巩固、提高和融合所学的专业课程知识,更重的是能够培养学生多方面的能力,如综合设计能力、动手能力、文献检索能力、团队合作能力、工程化能力、研究性学习能力、创新能力等。

数据结构课程是计算机专业最重要的基础课之一,主要研究分析计算机存

储、组织数据的方式,使学生学会数据的组织方法和现实世界问题在计算机内部的表示方法,并能针对应用问题,选择合适的数据逻辑结构、存储结构及其算法,掌握解决复杂问题的程序设计方法和技术。选择合适的数据结构更容易设计出更高效运行或存储效率的算法;反之,选择了特定的算法后也需要设计合适的数据结构与之配合,以达到最佳效果。所以,在进行程序设计时必须将数据结构和与之相关的算法结合起来考虑。

相关文档
最新文档