数据结构第7and 8讲--字符串与模式匹配
串的模式匹配算法
串串(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]这里的n就没有限制了,只要空间允许,开多大都可以。
2、数组来保存,描述为:const n=串的最大长度type strtype=records:array[1..n] of char;len:0..n;end;第二节模式匹配问题与一般的线性表不同,我们一般将串看成一个整体,它有一种特殊的操作——模式匹配。
《数据结构》参考教案
13
2、链队列的算法: : 算法一:构造一个空队列 算法二:销毁一个队列 算法三:判队列是否为空: 算法四:入队列 算法五:出队列
3.循环队列的重要算法: 算法一:构造一个空队列 算法二:队列长度 int { QueueLength(SqQueue Q)
return (Q.rear-Q.front+MAXQSIZE)%MAXQSIZE; }
(2) 重要算法的实现:
入栈操作 取栈顶元素操作 取栈顶元素与出栈不同之处在于出栈操作改变栈顶指针 top 的位置,而取栈顶元素操作不改 出栈操作 判栈空操作 2. 链栈 一个链栈可由栈顶指针 top 唯一确定,当 top 为 NULL 时,是一个空栈。
12
第9讲
课程名称:数据结构 授 课 总课序 第9次 时 间 第4周 任 课 教 师 备课日期 讲 课 内 容 3.4 节
点
教 学 难 点 与关键
算法时间复杂度的计算
教学内容及板书纲要: 课程概述 对课程性质等课程相关情况进行介绍
第 1 章 绪论 1.1 什么是数据结构 用 3 个引例: 1.图书书目自动检索 2.人机对奕 3.交通灯管理 引出《数据结构》的研究内容 数据结构的基本概念和术语 1.2 数据结构的基本概念和术语 1. 数据 2. 数据元素、数据项 3. 数据对象、数据结构 4. 四类基本结构:集合、线性结构、树形结构、图形结构或网状结构。 5. 数据结构一般包括三方面的内容: 逻辑结构 存储结构(物理结构) 数据的运算 算法的设计取决于选定的数据逻辑结构,而算法的实现依赖于采用的存储结构。 6. 数据的两种存储结构: 顺序存储结构 链式存储结构 1.3 抽象数据类型的表示与实现 类 C 语言 1.4 算法和算法分析 1.4.1 算法 算法的定义 算法具有五个重要特性: 有穷性、确定性、可行性、输入、输出
计算机存储和组织数据方式之《数据结构》 关于串和广义表的练习题(PPT内含答案)
• 的结果串为( D )。
• A.BCDEF
B.BCDEFG
• C.BCPQRST
D.BCDEFEF
A D A
习题5
• 二、填空题
• 1.字符串按存储方式可以分为:顺序存储、链接存储和
堆分配存储
。
• 2.在C语言中,以字符 '\0' 表示串值的终结。
• 3.空格串的长度等于 空格的个数 。
• 4.在空串和空格串中,长度不为0的是 空格串 。
• C."something"<"Somethig"
• D."BIT"="BITE"
• 8.设有两个串S1和S2,则StrCompare(S1,S2)运算称做 ( D )。
• A. 串连接
B.模式匹配
• C. 求子串
D.串比较
• 9.串的模式匹配是指( D )。
• A.判断两个串是否相等
• B.对两个串比较大小
B.顺序
• C.堆结构
D.无法确定
• 6.以下论述正确的是( C )。
• A.空串与空格串是相同的
• B."tel"是"Teleptone"的空串的长度等于1
习题5
• 7.以下论断正确的是(A )。
• A.“”是空串,“ ”是空格串
• B."BEIJING"是"BEI JING"的子串
• A."mo"
B."or"
C."in"
D."ng"
• 13. )S1="Good",S2="Morning",执行串连接函数 ConcatStr(S1,S2)后的结果为( A 。
2022年北京电子科技学院计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)
2022年北京电子科技学院计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、下列说法不正确的是()。
A.图的遍历是从给定的源点出发每个顶点仅被访问一次B.遍历的基本方法有两种:深度遍历和广度遍历C.图的深度遍历不适用于有向图D.图的深度遍历是一个递归过程2、设有一个10阶的对称矩阵A,采用压缩存储方式,以行序为主存储, a11为第一元素,其存储地址为1,每个元素占一个地址空间,则a85的地址为()。
A.13B.33C.18D.403、计算机算法指的是解决问题的步骤序列,它必须具备()三个特性。
A.可执行性、可移植性、可扩充性B.可执行性、确定性、有穷性C.确定性、有穷性、稳定性D.易读性、稳定性、安全性4、循环队列A[0..m-1]存放其元素值,用front和rear分别表示队头和队尾,则当前队列中的元素数是()。
A.(rear-front+m)%mB.rear-front+1C.rear-front-1D.rear-front5、在用邻接表表示图时,拓扑排序算法时间复杂度为()。
A.O(n)B.O(n+e)C.O(n*n)D.O(n*n*n)6、排序过程中,对尚未确定最终位置的所有元素进行一遍处理称为一趟排序。
下列排序方法中,每一趟排序结束时都至少能够确定一个元素最终位置的方法是()。
Ⅰ.简单选择排序Ⅱ.希尔排序Ⅲ.快速排序Ⅳ.堆排Ⅴ.二路归并排序A.仅Ⅰ、Ⅲ、Ⅳ B.仅Ⅰ、Ⅱ、Ⅲ C.仅Ⅱ、Ⅲ、Ⅳ D.仅Ⅲ、Ⅳ、Ⅴ7、下列叙述中,不符合m阶B树定义要求的是()。
A.根结点最多有m棵子树 B.所有叶结点都在同一层上C.各结点内关键字均升序或降序排列 D.叶结点之间通过指针链接8、一个具有1025个结点的二叉树的高h为()。
A.11B.10C.11至1025之间D.10至1024之间9、一棵哈夫曼树共有215个结点,对其进行哈夫曼编码,共能得到()个不同的码字。
A.107B.108C.214D.21510、下面给出的四种排序方法中,排序过程中的比较次数与排序方法无关的是()。
串的模式匹配算法
串的模式匹配算法字符串模式匹配是计算机科学中一种常用的算法。
它是一种检索字符串中特定模式的技术,可以用来在字符串中查找相应的模式,进而完成相应的任务。
字符串模式匹配的基本思想是,用一个模式串pattern去匹配另一个主串text,如果在text中找到和pattern完全匹配的子串,则该子串就是pattern的匹配串。
字符串模式匹配的过程就是在text中搜索所有可能的子串,然后比较它们是否和pattern完全匹配。
字符串模式匹配的算法有很多,其中著名的有暴力匹配算法、KMP算法、BM算法和Sunday算法等。
暴力匹配算法是最简单也是最常用的字符串模式匹配算法,其思想是从主串的某一位置开始,依次比较pattern中每一个字符,如果某个字符不匹配,则从主串的下一位置重新开始匹配。
KMP算法(Knuth-Morris-Pratt算法)是一种更为高效的字符串模式匹配算法,它的特点是利用了已匹配过的字符的信息,使搜索更加有效。
它的实现思想是,在pattern中先建立一个next数组,next数组的值代表pattern中每个字符前面的字符串的最大公共前缀和最大公共后缀的长度,这样可以在主串和模式串匹配失败时,利用next数组跳转到更有可能匹配成功的位置继续搜索,从而提高字符串模式匹配的效率。
BM算法(Boyer-Moore算法)也是一种高效的字符串模式匹配算法,它的实现思想是利用主串中每个字符最后出现的位置信息,以及模式串中每个字符最右出现的位置信息来跳转搜索,从而减少不必要的比较次数,提高搜索效率。
Sunday算法是一种简单而高效的字符串模式匹配算法,它的实现思想是,在主串中搜索时,每次从pattern的最右边开始比较,如果不匹配,则根据主串中下一个字符在pattern中出现的位置,将pattern整体向右移动相应位数,继续比较,这样可以减少不必要的比较次数,提高算法的效率。
字符串模式匹配算法的应用非常广泛,它可以用来查找文本中的关键字,检查一个字符串是否以另一个字符串开头或结尾,查找文本中的模式,查找拼写错误,检查字符串中是否包含特定的字符等。
2022年江西中医药大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)
2022年江西中医药大学计算机科学与技术专业《数据结构与算法》科目期末试卷A(有答案)一、选择题1、有一个100*90的稀疏矩阵,非0元素有10个,设每个整型数占2字节,则用三元组表示该矩阵时,所需的字节数是()。
A.60B.66C.18000D.332、将两个各有N个元素的有序表归并成一个有序表,其最少的比较次数是()。
A.NB.2N-1C.2ND.N-13、静态链表中指针表示的是()。
A.下一元素的地址B.内存储器的地址C.下一元素在数组中的位置D.左链或右链指向的元素的地址4、用不带头结点的单链表存储队列,其队头指针指向队头结点,队尾指针指向队尾结点,则在进行出队操作时()。
A.仅修改队头指针B.仅修改队尾指针C.队头、队尾指针都可能要修改D.队头、队尾指针都要修改5、有六个元素6,5,4,3,2,1顺序入栈,下列不是合法的出栈序列的是()。
A.543612B.453126C.346521D.2341566、若一棵二叉树的前序遍历序列为a,e,b,d,c,后序遍历序列为b, c,d,e,a,则根结点的孩子结点()。
A.只有e B.有e、b C.有e、c D.无法确定7、下列选项中,不能构成折半查找中关键字比较序列的是()。
A.500,200,450,180 B.500,450,200,180C.180,500,200,450 D.180,200,500,4508、已知一棵二叉树的前序遍历结果为ABCDEF,中序遍历结果为CBAEDF,则后序遍历结果为()。
A.CBEFDAB.FEDCBAC.CBEDFAD.不定9、下述二叉树中,哪一种满足性质:从任一结点出发到根的路径上所经过的结点序列按其关键字有序()。
A.二叉排序树B.哈夫曼树C.AVL树D.堆10、数据序列(8,9,10,4,5,6,20,1,2)只能是下列排序算法中的()的两趟排序后的结果。
A.选择排序B.起泡排序C.插入排序D.堆排序二、填空题11、在有n个顶点的有向图中,每个顶点的度最大可达______。
字符串匹配问题的算法步骤
字符串匹配问题的算法步骤字符串匹配是计算机科学中常见的问题,主要用于确定一个字符串是否包含另一个字符串。
解决这个问题的算法可以分为暴力匹配算法、Knuth-Morris-Pratt(KMP)算法和Boyer-Moore(BM)算法等。
暴力匹配算法是最简单的一种方法。
它的基本思想是从主串的第一个字符开始,依次和模式串的每个字符进行比较,直到找到一个字符不匹配为止。
如果找到了不匹配的字符,则将主串的指针后移一位,重新开始匹配。
如果匹配成功,模式串的指针向后移一位,主串的指针也向后移一位,继续匹配。
这个过程一直进行下去,直到模式串的指针到达模式串的末尾,或者找到了一个匹配的子串。
尽管暴力匹配算法很简单,但是它的时间复杂度较高,为O(m*n),其中m是主串的长度,n是模式串的长度。
当主串和模式串很长时,暴力匹配算法的效率就会很低。
为了提高字符串匹配的效率,有很多其他的算法被提出。
其中比较著名的是KMP算法和BM算法。
KMP算法的核心思想是,当发生不匹配的情况时,不需要回溯主串的指针,而是通过已经匹配的部分字符的信息,将模式串的指针移动到一个新的位置,从而避免了不必要的比较。
具体来说,KMP算法在匹配的过程中,通过建立一个部分匹配表(Partial Match Table),来记录模式串中每个位置的最长前缀后缀的长度。
当发生不匹配的情况时,根据部分匹配表的信息,可以将模式串的指针直接移动到下一个可能匹配的位置。
BM算法是一种基于启发式的匹配算法,它的核心思想是从模式串的尾部开始匹配,并根据已经匹配的部分字符的信息,跳跃式地移动模式串的指针。
具体来说,BM算法分别构建了坏字符规则和好后缀规则。
坏字符规则用于处理主串中与模式串不匹配的字符,找到最右边的该字符在模式串中的位置,并移动模式串的指针到对齐该字符。
好后缀规则用于处理主串中与模式串匹配的部分,找到最右边的该部分在模式串中的位置,并移动模式串的指针到对齐该部分。
字符串模式匹配bf算法
BF算法,也就是Brute Force算法,是一种基本的字符串模式匹配算法。
它通过遍历文本串,逐一比较字符来实现模式匹配。
以下是BF算法的800字说明:1. 算法原理BF算法的基本原理是在文本串中从左到右依次扫描,对于扫描到的每一个位置,将该位置的文本与模式串中的每个模式字符进行比较,以确定是否存在匹配。
如果找到了匹配,则算法结束;否则,继续扫描下一个位置。
2. 算法步骤(1)初始化两个指针,一个指向文本串的起始位置,另一个指向模式串的起始位置;(2)比较起始位置的字符是否匹配,如果不匹配则算法结束;(3)如果匹配,移动两个指针,分别到下一个位置继续比较;(4)重复步骤(2)和(3),直到文本串完全扫描完或者没有匹配到为止。
3. 算法时间复杂度BF算法的时间复杂度是O(n*m),其中n是文本串的长度,m是模式串的长度。
这是因为每次比较都需要花费一定的时间,而整个过程需要比较n-m+1次。
4. 算法优缺点优点:简单易懂,实现起来相对容易。
缺点:时间复杂度较高,对于较长的文本串和模式串,效率较低。
此外,BF算法只能用于查找单一的模式,对于多个模式的查找需要使用其他算法。
5. 实际应用BF算法在实际应用中主要用于文本搜索、模式匹配等场景。
例如,在搜索引擎中,BF算法常被用于网页的关键词匹配和搜索结果排序。
此外,BF算法还可以用于病毒扫描、文件校验等领域。
总之,BF算法是一种基本的字符串模式匹配算法,适用于简单的文本搜索和模式匹配场景。
虽然其时间复杂度较高,但对于一些特定的应用场景,BF算法仍然是一种有效的方法。
当然,随着计算机技术的发展,还有很多高效的模式匹配算法被提出,如KMP算法、BM算法、Rabin-Karp算法等,可以根据具体应用场景选择合适的算法。
串的模式匹配算法
/* 在目标串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++;}
/*字符比较成功,继续比较后续字符*/
设有两个串S和T,其中: S="s1s2s3…sn" T="t1t2t3…tm"(1≤m≤n,通常有m<n)
模式匹配算法的基本思想是:用T中字符依次与S中 字符比较:从S中的第一个字符(i=1)和T中第一个字 符( j=1)开始比较,如果s1=t1,则i和j各加1,继续 比较后续字符,若s1=t1,s2=t2,…,sm=tm, 返回1;否则,一定存在某个整数j(1≤j≤m)使得si≠tj ,即第一趟匹配失败,一旦出现这种情况,立即中断 后面比较,将模式串T向右移动一个字符执行第二趟 匹配步骤,即用T中第一个字符( j=1)与S中的第2个字 符(i=2)开始依次比较;
数据结构
串的模式匹配算法
基本的模式匹配算法
子串定位操作又称为串的模式匹配(Pattern Matching)或串匹配,该操作是各种串处理系统中的 重要操作之一 。
子串定位操作是要在主串中找出一个与子串相同的 子串。一般将主串称为目标串,子串称之为模式串。 设S为目标串,T为模式串,把从目标串S中查找模式串 T的过程成为“模式匹配”。匹配的结果有两种:如果 S中有模式为T的子串,则返回该子串在S中的位置,若 S中有多个模式为T的子串时,则返回的是模式串T在S 中第一次出现的位置,这种情况称匹配成功;否则,称 为匹配失败。
数据结构—串的模式匹配
数据结构—串的模式匹配数据结构—串的模式匹配1.介绍串的模式匹配是计算机科学中的一个重要问题,用于在一个较长的字符串(称为主串)中查找一个较短的字符串(称为模式串)出现的位置。
本文档将详细介绍串的模式匹配算法及其实现。
2.算法一:暴力匹配法暴力匹配法是最简单直观的一种模式匹配算法,它通过逐个比较主串和模式串的字符进行匹配。
具体步骤如下:1.从主串的第一个字符开始,逐个比较主串和模式串的字符。
2.如果当前字符匹配成功,则比较下一个字符,直到模式串结束或出现不匹配的字符。
3.如果匹配成功,返回当前字符在主串中的位置,否则继续从主串的下一个位置开始匹配。
3.算法二:KMP匹配算法KMP匹配算法是一种改进的模式匹配算法,它通过构建一个部分匹配表来减少不必要的比较次数。
具体步骤如下:1.构建模式串的部分匹配表,即找出模式串中每个字符对应的最长公共前后缀长度。
2.从主串的第一个字符开始,逐个比较主串和模式串的字符。
3.如果当前字符匹配成功,则继续比较下一个字符。
4.如果当前字符不匹配,则根据部分匹配表的值调整模式串的位置,直到模式串移动到合适的位置。
4.算法三:Boyer-Moore匹配算法Boyer-Moore匹配算法是一种高效的模式匹配算法,它通过利用模式串中的字符出现位置和不匹配字符进行跳跃式的匹配。
具体步骤如下:1.构建一个坏字符规则表,记录模式串中每个字符出现的最后一个位置。
2.从主串的第一个字符开始,逐个比较主串和模式串的字符。
3.如果当前字符匹配成功,则继续比较下一个字符。
4.如果当前字符不匹配,则根据坏字符规则表的值调整模式串的位置,使模式串向后滑动。
5.算法四:Rabin-Karp匹配算法Rabin-Karp匹配算法是一种基于哈希算法的模式匹配算法,它通过计算主串和模式串的哈希值进行匹配。
具体步骤如下:1.计算模式串的哈希值。
2.从主串的第一个字符开始,逐个计算主串中与模式串长度相同的子串的哈希值。
字符串匹配方法
字符串匹配方法引言:字符串匹配是计算机科学中一项重要的技术,它在文本处理、数据分析、搜索引擎等领域都有广泛的应用。
本文将介绍几种常见的字符串匹配方法,包括暴力匹配、KMP算法、Boyer-Moore算法和正则表达式。
一、暴力匹配算法暴力匹配算法,也称为朴素匹配算法,是最简单直观的字符串匹配方法。
它的思想是从待匹配文本的第一个字符开始,依次与模式串进行比较,若匹配失败则移动到下一个字符继续比较,直到找到匹配的子串或者遍历完整个文本。
该算法的时间复杂度为O(n*m),其中n为文本长度,m为模式串长度。
二、KMP算法KMP算法是一种高效的字符串匹配算法,它的核心思想是通过预处理模式串,构建一个部分匹配表(Next数组),以便在匹配过程中根据已匹配的前缀字符来确定下一次匹配的位置。
这样可以避免不必要的回溯,提高匹配效率。
KMP算法的时间复杂度为O(n+m),其中n为文本长度,m为模式串长度。
三、Boyer-Moore算法Boyer-Moore算法是一种基于比较字符的右移策略的字符串匹配算法。
它的主要思想是从模式串的末尾开始与待匹配文本比较,若匹配失败则根据预先计算好的字符移动表来决定模式串的右移位数。
这样可以根据比较结果快速确定下一次比较的位置,从而提高匹配效率。
Boyer-Moore算法的时间复杂度为O(n/m),其中n为文本长度,m为模式串长度。
四、正则表达式正则表达式是一种强大的字符串匹配工具,它通过一种特定的语法规则来描述字符串的模式,并通过匹配模式来判断字符串是否符合要求。
正则表达式可以实现复杂的匹配功能,包括字符匹配、重复匹配、分组匹配等。
在文本处理、数据清洗、搜索引擎等领域都有广泛的应用。
结论:字符串匹配是计算机科学中一项重要的技术,不同的匹配方法适用于不同的应用场景。
暴力匹配算法简单直观,适用于模式串较短的情况;KMP算法通过预处理模式串,提高匹配效率;Boyer-Moore算法通过右移策略,减少不必要的比较次数;正则表达式可以实现复杂的匹配功能。
数据结构-串
数据结构-串数据结构-串概述:串是由零个或多个字符组成的有限序列,是一种常见的数据类型。
在计算机科学中,串经常被用来表示文本字符串。
本文将介绍串的基本定义、操作以及相关的应用。
1.串的定义1.1 字符集字符集是构成串的基本元素,它包含了一个或多个字符。
1.2 串的长度串的长度是指串中字符的个数,通常用n表示。
1.3 串的表示串的表示可以使用字符数组、指针、链表等方法,具体的表示方法根据实际情况选择。
2.串的基本操作2.1 串的初始化初始化一个空串或者将一个已有的串赋值给另一个串变量。
2.2 串的连接将两个串连接起来形成一个新串。
2.3 串的截取对一个串进行截取,截取出一个子串。
2.4 串的比较比较两个串是否相等或者大小关系。
2.5 串的插入在一个串的指定位置插入一个子串。
2.6 串的删除从一个串中删除指定位置的子串。
2.7 串的替换在一个串中将指定位置的子串替换为另一个子串。
3.串的应用3.1 字符串匹配判断一个串是否包含另一个串,可以使用字符串匹配算法,如朴素模式匹配算法、KMP算法等。
3.2 文本编辑在文本编辑器中对文本进行插入、删除、替换等操作,就是基于串的操作。
3.3 编码解码在计算机通信中,对数据进行编码和解码时,也会使用到串的操作。
3.4 数据压缩在数据压缩算法中,也会使用到串的操作。
本文档涉及附件:无法律名词及注释:1.串:在计算机科学中,串指由零个或多个字符组成的有限序列。
2.字符集:字符集是指包含了一个或多个字符的集合,比如ASCII、Unicode等。
常用的匹配算法
71.
}
72.
else
73.
{
74.
i += delta_2[j];
75.
}
76.
j = find_len - 1;
77.
}
78.
if (j == -1)
79.
return i+1;
80. }
81.
82. return -1;
83. }
提示:该算法主要利用坏字符规则和好后缀规则进行转换。所谓坏字符规则,是指不能匹配时的字符在待匹配字串中从右边数的位置;而好 后缀规则则是指子串中从该不匹配位置后面所有字符(都是已匹配字符)再次在字串中出现的位置(k),其中s[k,k+1,---,k+len-j-1] = s[j+1, j+1,---,len-1], 并且s[k-1] != [j] || s[k-1] = $, 其中$表示增补的字符,可以与任何字符相等。
30. int j = 0;
31. for (i=2; i<find_len; i++)
32. {
33.
while (1)
34.
{
35.
if (find[i-1] == find[j])
36.
{
37.
j++;
38.
if (find[i] == find[j])
39.
{
40.
map[i] = map[j];
//chars.
41.
for (k=1; j<(len-1) && k<len; k++)
42.
{
《KMP 字符串模式匹配算法》教学课例
《KMP字符串模式匹配算法》教学课例程玉胜安庆师范学院计算机与信息学院KMP字符串模式匹配是数据结构课程中一个重要的知识点,也是一个难点(学过KMP 算法的同学100%认为:KMP是数据结构课程中最难的部分)。
为了消除他们对KMP算法学习的恐惧心理,激发他们的学习兴趣,调动其积极性,显得尤为重要。
基于以上,我们根据学生的认知特点和接受水平,对教材内容进行了重新构建,并按照数据结构中“时间复杂度”概念,增加了不同模式匹配算法的运行时间,动态逼真的显示了算法的“时间”性能,获得了较好的教学效果。
一、教学目标知识目标:让学生了解KMP算法应用的普遍性。
如:在目前众多的文字处理软件中得到广泛应用,如Microsoft Word中的“查找”或“替换”操作。
而这种操作实现的机制,同学们特别是计算机专业的学生很少去想过。
能力目标:要求学生体验一个完整的抽象数据类型(ADT)的实现方法和过程,并学会判断、计算算法优劣的方法。
价值目标:消除恐怖的学习心态,让学生感悟数据结构算法实际应用价值,从而激发学习的兴趣,形成积极主动式学习的态度。
二、教材分析使用教材是清华大学严蔚敏教授并由清华大学出版社出版的《数据结构(C语言版)》,该教材难度较大,其实验方法特别是ADT方法在教材中介绍较少,而且KMP算法更是从理论分析的角度介绍了匹配算法和next的计算,自学难度很大;虽然该节知识点属于“**(表示难度较大,可以不讲)”,但是其又是考研的一个热点,所以我们又不得不讲。
三、教学重点、难点教学重点:KMP算法中的next和改进的nextval计算教学难点:KMP算法中如何计算next值四、教具准备卡片:多个字符串,字符串指针强力磁吸:6个五、互动式教学过程教学内容教师活动学生活动目标状态创设情境引入课题目前的众多软件中,“查找”、“替换”等操作实现方法,要求学生举例。
给出一篇word文档完成在上述文档中从当前位置向后查找“计算机”或者向前查找“计算机”字符串的方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
{ char c; //字符 PStrNode link; //指针
};
typedef struct StrNode *LinkString; //链串指针类型
河海大学计算机与信息学院
第3章 字符串
第7、8讲:字符串与模式匹配
回顾
线性表:有限个、类型相同的元素组成的 有序序列
k0 k1 k2 k3 k4
-- 顺序表(逻辑相邻<=>物理相邻) 便于按序号随机访问;存储密度大;
-- 链表 H k0
k1
k2
k3
k4 ∧
方便插入、删除结点;无惧表长变化;
3.1 字符串
2) 则j在主串上回溯,i在模式串上亦回溯
jj 如何减少回溯, 或
t: a b b a b a 提高右移位数? p: a ab ba a
i ii
提高匹配速度
减少回溯的可行性
”不等”, 即pi ≠ tj , 等价于:前面都等, 当前不等
p0= tj-i, p1= tj-i+1, …, pi-1= tj-1, pi ≠ tj
q->c=p->c; q->link=NULL; //置结点q
t->link=q; t=q; //在s1的尾巴t之后插入结点q p=p->link; } return s1; } //s1的长度<=j
字符串的表示 – 小结
顺序表示 顺序串 链接表示 链串
特殊线性表的不同实现
• 许多编程语言提供了标准的字符串库, 例如,C语言标准库 (string.h)
5) String subStr(String s1, int i, int j) //求子串 //求串s1中从第i个起连续j个字符组成的序列
6) int index(String s1, String s2) //求子串位置 //若s2是s1的子串,则返回s2在s1中的位置
7) String StrCopy(String T, String S) //复制S到T
• 空串:长度为0的串,记为s=“”, 注意与“ ”(空格构成的串)进行区别;
• 字符串相等:每一个位置处的字符都相等; 长度相等;
• 字典序关系:若字符集上有全(线)序关系, 设A=“a0a1…an-1”, B =“b0b1…bm-1”,
1) 若存在k使ai==bi (i=0,…,k-1)且ak<bk
else printf(“Out of space! \n”); //报错 return(pst); }
• 已知带头结点的链串s, 求其子串(第i个字符开始、连续j个字符组成的串) 1) 创建空链串s1; 2) 判断i与j的值是否都 >0;否, 则返回空串; 3) 查找s的第i个结点: 4) 未找到,则返回空串; 5) 找到,则依次取j个字符、从尾部插入到s1中, (若不够j个字符,则有多少取多少到s1中);
或 2) ai==bi (i=0,…,n-1)且n<m 则 A<B 例 A=“abc”, B=“abd” 或 B=“abcd”
子串、主串、子串位置
子串:s串中任意个、连续的字符所组成的 串s1称为原串s的子串,s称为s1的主串
“Hohai Universtiy”
-- 空串是任意串的子串;
“University”
11) delete(String s, int i) //删除串s中、位置i处的字符
12) replace(String s, int i, char c) //将串s中、位置i处的字符用c替换
3.2 字符串的表示/实现
字符串:数据元素为字符的线性表 -- 顺序表示 (顺序串): 将所有字符顺序地存储在一组地址连续的 内存单元,字符数组
j=2
p0= t0, p1= t1, p2 ≠ t2
t: a b b a b 若a 已知 p0≠ p1, p0=p2
p: a b a
i=2
p0≠ t1, p0≠ t2
朴素匹配省略两步
else return 0; }
代价分析
最坏情况 (例如t=“00……01”, p=“0001”) 每次都在p的最后一个字符处匹配失败
主串长度n, 模式串长度m; 最多比较 n-m+1 趟, 每趟最多比较 m 次; 时间复杂度O(m*n)
朴素匹配小结
朴素模式匹配的特点:遇到”不等”, 即pi ≠ tj 1) p相对于t 仅右移1位
-- 链接表示 (链串): 字符链表
3.2 字符串的顺序表示
顺序串定义
struct SeqString { int MaxNum; //最大长度
int n; //实际字符个数 char *c; }; //指向字符数组的指针 typedef struct SeqString *PSeqString; //顺序串指针类型
• C语言中的字符串直接由字符数组表示, 以” \0”作为串结束的标志
3.3 模式匹配
• 模式匹配:在目标串t中查找与模式串p相同的
子串 例 t = t0 t1 t2 t3 t4…tn-1 目标(target)
p = p0p1…pm-1
模式(pattern)
• 求串s2在串s1中第一次出现的位置: int index(String s1, String s2)
• 创建空顺序串 (与课本p71程序逻辑相同)
PSeqString creatNullStr_seq(int m)
{ PSeqString pstr = (PSeqString)malloc //申请顺序串空间 (sizeof(Struct SeqString));
if (pstr==Null) {printf(“out of !\n”); return Null;}
8) DestroyString (String S) //销毁串S
9) int StrCompare (String S, String T) //比较大小 //若S=T,返回0; 若>, 返回值>0; 若<, 返回值<0
3.1 字符串的抽象数据类型
串与字符之间的操作:
10) insert(String s1, int i, char c) //在串s中、位置i处插入字符c
j=2
p0= t0, p1= t1, p2 ≠ t2
t: a b b a b 若a 已知 p0≠ p1, p0=p2
p: a b a
i=2
p0≠ t1, p0≠ t2
朴素匹配省略两步
直接p0与t3开始比较
减少回溯的可行性
利用”不等”及其之前包含的”相等信息” ,以及 模式p中的”相等和不等信息” 可减少回溯
字符串:数据元素为字符的线性表;
计算机可以执行
数值计算
非数值计算 例如,关键词搜索
图像搜索 语音搜索
3.1 字符串
一个字符串可以记为:S=“s0s1s2s3” -- S是串的名字; -- 字符序列s0s1s2s3是串的值; -- 字符个数是串的长度; -- 串中元素可以是字母、数字、其他字符 (空格、%,=,@ 等键盘可以输入的) -- 双引号是串的定界符,不是串的一部分;
}
实际结点
t=s1; // p指向s的第i个结点, t指向子串s1的尾巴 for(k=1;k<=j; k++) //复制j个结点, 尾插到s1中
if(p != NULL) {q=(PStrNode)malloc(sizeof(struct StrNode));
if(q==NULL) {printf(“Fail !\n”); return s1;}
• 应用:搜索引擎, 病毒特征码匹配, DNA匹配
3.3 模式匹配
• 朴素的模式匹配 j j jjjj j
t: a b b a b a p: pa: abp: bap: ab ba a 下标i>= p的长度
i i i i i i i 找到
• 无回溯的模式匹配
3.3 朴素的模式匹配
jj j
t: a b b a b a p: pa: ab ba a
{ if(s->n < i+j-1) j=s->n-i+1; //s不够长, 重置j for(k=0; k<j; k++)
s1->c[k] = s->c[i-1+k];//复制到s1中 s1->n = j; //设置子串的实际长度 }
return s1; } 时间代价: O(j)
3.2 字符串的链接表示
else //s不够
while(p!=NULL && k<=i) {p=p->link; k=k+1;}
return s1; if (p==NULL || k!=i+1)
if (p==NULL)
{ printf(“i is illegal !\n”);
return s1;
return s1;
//s只有i-1个
while(i<p->n && j<t->n)//下标有意义 if (p->c[i]==t->c[j]) //相等, 则继续向后 { i++; j++;} else { j=j-i+1; i=0;}//不等, 则重新定位i, j
if (i >= p->n) //(第1次)匹配成功的标志 return (j- p->n +1);//返回出现位置下标+1