版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、佛山科学技术学院佛山科学技术学院 FoshanFoshan University University16.1 树的定义和基本术语树的定义和基本术语6.2 二叉树二叉树6.3 遍历二叉树和线索二叉树遍历二叉树和线索二叉树6.4 树和森林树和森林6.6 赫夫曼树及其应用赫夫曼树及其应用佛山科学技术学院佛山科学技术学院 FoshanFoshan University University2l基于先基于先/中中/后序遍历的算法应用后序遍历的算法应用l基于先序遍历的二叉树基于先序遍历的二叉树(二叉链二叉链)的创建的创建l统计二叉树中叶子结点的数目统计二叉树中叶子结点的数目l释放二叉树的所有结点空间释放
2、二叉树的所有结点空间l删除并释放二叉树中以元素值为删除并释放二叉树中以元素值为x的结点作为根的各的结点作为根的各子树子树l求位于二叉树先序序列中第求位于二叉树先序序列中第k个位置的结点的值个位置的结点的值分析问题本身的特征,选择合适的遍历次序!分析问题本身的特征,选择合适的遍历次序!应用递归编写算法,简洁!应用递归编写算法,简洁!注意注意:递归结束条件,用递归调用的结果。:递归结束条件,用递归调用的结果。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University3Status CreateBiTree(BiTree &T) /按先序次序输入二
3、叉树中结点的值按先序次序输入二叉树中结点的值(一个字符一个字符) /空格字符表示空树空格字符表示空树,构造二叉链表表示的二叉树构造二叉链表表示的二叉树T scanf(&ch); if ( ch= ) T = NULL; else if (!(T = (BiTNode *)malloc(sizeof(BiTNode) exit(OVERFLOW); T-data = ch; CreateBiTree(T-lchild); CreateBiTree(T-rchild); return OK; / CreateBiTree佛山科学技术学院佛山科学技术学院 FoshanFoshan Unive
4、rsity University4【本例特征【本例特征】v 如何通过全局变量、变参、返回值三种渠道返回如何通过全局变量、变参、返回值三种渠道返回处理结果?处理结果?【思路【思路】 在遍历二叉树时,对一些特殊的结点在遍历二叉树时,对一些特殊的结点( (无左右孩子无左右孩子) )进行计数。可以将进行计数。可以将遍历算法的结点访问操作遍历算法的结点访问操作修改为修改为对特殊结点的判定和计数过程对特殊结点的判定和计数过程,需要注意的是计数,需要注意的是计数器的处理方式。器的处理方式。 佛山科学技术学院佛山科学技术学院 FoshanFoshan University University5 可以有以下几
5、种计数处理:可以有以下几种计数处理:用遍历函数的用遍历函数的返回值返回值传出求得的叶子结点的数传出求得的叶子结点的数目;目;为遍历函数增加一个为遍历函数增加一个引用参数引用参数,用来传出指定,用来传出指定二叉树的叶子结点数目。二叉树的叶子结点数目。引入引入全局的计数器全局的计数器,初始为,初始为0;此处,遍历次序的选择对本算法没有太大影响。此处,遍历次序的选择对本算法没有太大影响。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University6【算法【算法1】 / n为叶子结点的计数器为叶子结点的计数器 intn=0; void leaf(BiTree
6、T) / 利用二叉树的先序遍历利用二叉树的先序遍历if (T != NULL )/ 访问结点访问结点-叶子的判定和计数叶子的判定和计数if( T-lchild=NULL & T-rchild=NULL )n+;leaf(T-lchild);leaf(T-rchild); / 调用结束,即可由调用结束,即可由n获得二叉树获得二叉树T的叶子结点数目的叶子结点数目 需注意每次调用前须执行需注意每次调用前须执行n=0;佛山科学技术学院佛山科学技术学院 FoshanFoshan University University7【算法【算法2 以函数返回值返回以函数返回值返回】/ 函数值为函数值为T的
7、叶子结点数的叶子结点数vintleaf(BiTree T)v / 利用二叉树的中序遍历利用二叉树的中序遍历, n为局部变量为局部变量vint n = 0; vif ( T != NULL )v n = leaf ( T-lchild );v/ 访问结点访问结点-叶子结点的判定和计数叶子结点的判定和计数vif ( T-lchild=NULL & T-rchild=NULL )n+;vn += leaf(T-rchild);vvreturn (n);vvn定义为静态变量,算法需要如何修改呢?定义为静态变量,算法需要如何修改呢?佛山科学技术学院佛山科学技术学院 FoshanFoshan Un
8、iversity University8【算法【算法3 通过引用参数返回】通过引用参数返回】/ 引用参数引用参数n为为T的叶子结点数的叶子结点数vvoid leaf(BiTree T, int &n)v / 利用二叉树的后序遍历利用二叉树的后序遍历vn = 0;vint n1=0;vif ( T != NULL )v leaf (T-lchild, n);vleaf (T-rchild, n1);v/ 访问结点访问结点-叶子结点的判定和计数叶子结点的判定和计数vif ( T-lchild=NULL & T-rchild=NULL ) n+;vn += n1;vv佛山科学技术学院
9、佛山科学技术学院 FoshanFoshan University University9【思路】【思路】v二叉树为空时,不必释放;二叉树为空时,不必释放;v若若T不为空,则先释放其左右子树的所有结点的不为空,则先释放其左右子树的所有结点的空间,再释放根结点的空间空间,再释放根结点的空间后序。后序。v若在释放子树的空间前,先释放根结点的空间,若在释放子树的空间前,先释放根结点的空间,则需要将子树的根结点的指针暂存到其他变量;否则需要将子树的根结点的指针暂存到其他变量;否则,无法找到子树。则,无法找到子树。佛山科学技术学院佛山科学技术学院 FoshanFoshan University Unive
10、rsity10【算法【算法】vvoid deleteBiTree(BiTree &T)v/ 此处此处T应为引用参数应为引用参数vif ( T != NULL )v deleteBiTree(T-lchild );vdeleteBiTree(T-rchild );v/ 访问结点访问结点-释放结点的空间释放结点的空间vfree(T);vT = NULL; vv佛山科学技术学院佛山科学技术学院 FoshanFoshan University University11【本例特征【本例特征】 如何选择二叉树的先序、中序、后序遍历来解决如何选择二叉树的先序、中序、后序遍历来解决问题,它们对问题求解
11、有何影响?问题,它们对问题求解有何影响? 【思路【思路】 整个过程分为两个方面:整个过程分为两个方面:遍历中查找元素值为遍历中查找元素值为x的结点的结点查到该结点时,调用例查到该结点时,调用例3的算法释放子树空间。的算法释放子树空间。 需要考虑的问题是:需要考虑的问题是:v如何将全部的结点找到并释放?如何将全部的结点找到并释放?佛山科学技术学院佛山科学技术学院 FoshanFoshan University University12【算法【算法】vvoid deleteXTree(BiTree &T, ElemType x)v / 基于先序的查找基于先序的查找vif ( T != NU
12、LL )v / 访问结点访问结点-判断是否为指定结点判断是否为指定结点-释放树空间释放树空间vif ( T-data= x ) deleteBiTree(T);vElsev / 此处此处else不能省略不能省略vdeleteXTree(T-lchild, x);vdeleteXTree(T-rchild, x);vvv佛山科学技术学院佛山科学技术学院 FoshanFoshan University University13【本例特征【本例特征】v如何处理多个返回结果?如何处理多个返回结果?【思路【思路】 待查结点的待查结点的存在性存在性:v当二叉树为当二叉树为空树空树,或者,或者k非法时,待查
13、结点非法时,待查结点不不存在存在v 函数应返回待查结点是否存在的状态指示:函数应返回待查结点是否存在的状态指示:TRUE或或FALSE 当待查找的结点当待查找的结点存在时存在时,需进一步返回,需进一步返回该结点的该结点的值值v 佛山科学技术学院佛山科学技术学院 FoshanFoshan University University14 在非数值处理、事务处理等问题常涉及到一系列在非数值处理、事务处理等问题常涉及到一系列的字符操作。计算机的硬件结构主要是反映数值计算的的字符操作。计算机的硬件结构主要是反映数值计算的要求,因此,字符串的处理比具体数值处理复杂。本章要求,因此,字符串的处理比具体数值处
14、理复杂。本章讨论串的存储结构及几种基本的处理。讨论串的存储结构及几种基本的处理。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University154.1 串类型的定义串类型的定义 串串( (字符串字符串) ):是零个或多个字符组成的有限序列。:是零个或多个字符组成的有限序列。记作:记作: S=“a1a2a3”,其中,其中S是串名,是串名,ai(1in)是单是单个,个,可以是字母、数字或其它字符。可以是字母、数字或其它字符。 串值串值:双引号括起来的字符序列是串值。:双引号括起来的字符序列是串值。 串长串长:串中所包含的字符个数称为该串的长度。:串中所包含
15、的字符个数称为该串的长度。 空串空串( (空的字符串空的字符串) ):长度为零的串称为空串,它不:长度为零的串称为空串,它不包含任何字符。包含任何字符。 空格串空格串( (空白串空白串) ):构成串的所有字符都是空格的串:构成串的所有字符都是空格的串称为空白串。称为空白串。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University16注意注意:空串和空白串的不同,例如:空串和空白串的不同,例如“ ”和和“”“”分别表示长度为分别表示长度为1 1的空白串和长度为的空白串和长度为0的空串。的空串。 子串子串( (substring) ):串中任意个连续字
16、符组成的子序列称为:串中任意个连续字符组成的子序列称为该串的子串,包含子串的串相应地称为主串。该串的子串,包含子串的串相应地称为主串。 子串的序号子串的序号:将子串在主串中首次出现时的该子串的首字符:将子串在主串中首次出现时的该子串的首字符对应在主串中的序号,称为子串在主串中的序号(或位置)。对应在主串中的序号,称为子串在主串中的序号(或位置)。例如,例如,设有串设有串A和和B分别是:分别是: A=“这是字符串这是字符串”,B=“是是”则则B是是A的子串,的子串,A为主串。为主串。B在在A中出现了两次,其中首次出现中出现了两次,其中首次出现所对应的主串位置是所对应的主串位置是3。因此,称。因此
17、,称B在在A中的序号为中的序号为3 。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University17 特别地,空串是任意串的子串,任意串是其自身的子串。特别地,空串是任意串的子串,任意串是其自身的子串。 串相等串相等:如果两个串的串值相等:如果两个串的串值相等( (相同相同) ),称这两个串相等。,称这两个串相等。换言之,只有当两个串的长度相等,且各个对应位置的字符都相换言之,只有当两个串的长度相等,且各个对应位置的字符都相同时才相等。同时才相等。 通常在程序中使用的串可分为两种:串变量和串常量。通常在程序中使用的串可分为两种:串变量和串常量。 串常
18、量和整常数、实常数一样,在程序中只能被引用但不能串常量和整常数、实常数一样,在程序中只能被引用但不能不能改变其值,即只能读不能写。通常串常量是由直接量来表示不能改变其值,即只能读不能写。通常串常量是由直接量来表示的,例如语句错误的,例如语句错误(“(“溢出溢出”) )中中“溢出溢出”是直接量。是直接量。 串变量和其它类型的变量一样,其值是可以改变。串变量和其它类型的变量一样,其值是可以改变。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University184.1.2 串的抽象数据类型定义串的抽象数据类型定义 ADT String数据对象:数据对象:D =
19、 ai|aiCharacterSet, i=1,2,n, n 0 数据关系:数据关系:R = | ai-1, aiD, i=2,3,n 基本操作:基本操作:StrAssign(t , chars)初始条件:初始条件: chars是一个字符串常量。是一个字符串常量。操作结果:生成一个值为操作结果:生成一个值为chars的串的串t 。StrConcat(s, t)初始条件:串初始条件:串s, t 已存在。已存在。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University19操作结果:将串操作结果:将串t联结到串联结到串s后形成新串存放到后形成新串存放到s
20、中。中。StrLength(t)初始条件:字符串初始条件:字符串t已存在。已存在。操作结果:返回串操作结果:返回串t中的元素个数,称为串长。中的元素个数,称为串长。SubString (s, pos, len, sub)初始条件:串初始条件:串s, 已存在已存在, 1posStrLength(s)且且 0lenStrLength(s) pos+1。操作结果:用操作结果:用sub返回串返回串s的第的第pos个字符起长度为个字符起长度为len的子串。的子串。 ADT String佛山科学技术学院佛山科学技术学院 FoshanFoshan University University204.2 串的存
21、储表示和实现串的存储表示和实现 串是一种特殊的线性表,其存储表示和线性表类似,但又不串是一种特殊的线性表,其存储表示和线性表类似,但又不完全相同。串的存储方式取决于将要对串所进行的操作。串在计完全相同。串的存储方式取决于将要对串所进行的操作。串在计算机中有算机中有3种表示方式:种表示方式: 定长顺序存储表示定长顺序存储表示:将串定义成字符数组,利用串名可:将串定义成字符数组,利用串名可以直接访问串值。用这种表示方式,串的存储空间在编译时以直接访问串值。用这种表示方式,串的存储空间在编译时确定,其大小不能改变。确定,其大小不能改变。 堆分配存储方式堆分配存储方式:仍然用一组地址连续的存储单元来依
22、:仍然用一组地址连续的存储单元来依次存储串中的字符序列,但串的存储空间是在程序运行时根次存储串中的字符序列,但串的存储空间是在程序运行时根据串的实际长度动态分配的。据串的实际长度动态分配的。 块链存储方式块链存储方式:是一种链式存储结构表示。:是一种链式存储结构表示。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University214.2.1 串的定长串的定长顺序顺序存储表示存储表示 这种存储结构又称为串的顺序存储结构。是用一组连续的存这种存储结构又称为串的顺序存储结构。是用一组连续的存储单元来存放串中的字符序列。所谓定长顺序存储结构,是直接储单元来存放
23、串中的字符序列。所谓定长顺序存储结构,是直接使用定长的字符数组来定义,数组的上界预先确定。使用定长的字符数组来定义,数组的上界预先确定。定长顺序存储结构定义为:定长顺序存储结构定义为:#define MAX_STRLEN 256typedef struct char strMAX_STRLEN ;int length; StringType ; 佛山科学技术学院佛山科学技术学院 FoshanFoshan University University221 串的联结操作串的联结操作Status StrConcat ( StringType s, StringType t)/* 将串将串t联结到串联
24、结到串s之后,结果仍然保存在之后,结果仍然保存在s中中 */ int i, j ;if (s.length+t.length)MAX_STRLEN)Return ERROR ; /* 联结后长度超出范围联结后长度超出范围 */ for (i=0 ; it.length ; i+)s.strs.length+i=t.stri ; /* 串串t联结到串联结到串s之后之后 */s.length=s.length+t.length ; /* 修改联结后的串长度修改联结后的串长度 */return OK ;佛山科学技术学院佛山科学技术学院 FoshanFoshan University Universi
25、ty232 求子串操作求子串操作Status SubString (StringType s, int pos, int len, StringType *sub) int k, j ;if (poss.length|len(s.length-pos+1)return ERROR ; /* 参数非法参数非法 */sub-length=len-pos+1 ; /* 求得子串长度求得子串长度 */for (j=0, k=pos ; kstrj=s.stri ; /* 逐个字符复制求得子串逐个字符复制求得子串 */return OK ;佛山科学技术学院佛山科学技术学院 FoshanFoshan Un
26、iversity University244.2.2 串的堆分配存储表示串的堆分配存储表示 实现方法:系统提供一个空间足够大且地址连续的存储空间实现方法:系统提供一个空间足够大且地址连续的存储空间( (称为称为“堆堆”) )供串使用。可使用供串使用。可使用C语言的动态存储分配函数语言的动态存储分配函数malloc()和和free()来来管理。管理。 特点是:仍然以一组地址连续的存储空间来存储字符串值,特点是:仍然以一组地址连续的存储空间来存储字符串值,但其所需的存储空间是在程序执行过程中动态分配,故是动态的,但其所需的存储空间是在程序执行过程中动态分配,故是动态的,变长的。变长的。串的堆式存储
27、结构的类型定义串的堆式存储结构的类型定义typedef struct char *ch; /* 若非空,按长度分配,否则为若非空,按长度分配,否则为NULL */int length; /* 串的长度串的长度 */ HString ;佛山科学技术学院佛山科学技术学院 FoshanFoshan University University251 串的联结操作串的联结操作Status Hstring *StrConcat(HString *T, HString *s1, HString *s2)/* 用用T返回由返回由s1和和s2联结而成的串联结而成的串 */ int k, j , t_len ;
28、if (T.ch) free(T); /* 释放旧空间释放旧空间 */t_len=s1-length+s2-length ;if (p=(char *)malloc(sizeof(char)*t_len)=NULL) printf(“系统空间不够,申请空间失败系统空间不够,申请空间失败 !n”) ; return ERROR ; for (j=0 ; jlength; j+) T-chj=s1-chj ; /* 将串将串s复制到串复制到串T中中 */佛山科学技术学院佛山科学技术学院 FoshanFoshan University University26for (k=s1-length, j=
29、0 ; jlength; k+, j+) T-chj=s1-chj ; /* 将串将串s2复制到串复制到串T中中 */free(s1-ch) ; free(s2-ch) ; return OK ; 佛山科学技术学院佛山科学技术学院 FoshanFoshan University University274.2.3 串的链式存储表示串的链式存储表示 串的链式存储结构和线性表的串的链式存储结构类似,采用串的链式存储结构和线性表的串的链式存储结构类似,采用单链表来存储串,单链表来存储串,结点的构成是:结点的构成是: data域:存放字符,域:存放字符,data域可存放的字符个数称为结点的域可存放的字
30、符个数称为结点的大小;大小; next域:存放指向下一结点的指针。域:存放指向下一结点的指针。 若每个结点仅存放一个字符,则结点的指针域就非常多,造若每个结点仅存放一个字符,则结点的指针域就非常多,造成系统空间浪费,为节省存储空间,考虑串结构的特殊性,使每成系统空间浪费,为节省存储空间,考虑串结构的特殊性,使每个结点存放若干个字符,这种结构称为块链结构。如个结点存放若干个字符,这种结构称为块链结构。如图图4-1是块是块大小为大小为3的串的块链式存储结构示意图。的串的块链式存储结构示意图。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University28串
31、的块链式存储的类型定义包括:串的块链式存储的类型定义包括: 块结点的类型定义块结点的类型定义#define BLOCK_SIZE 4typedef struct Blstrtype char dataBLOCK_SIZE ;struct Blstrtype *next;BNODE ;a b c e p c g head图图4-1 串的块链式存储结构示意图串的块链式存储结构示意图佛山科学技术学院佛山科学技术学院 FoshanFoshan University University29(2) 块链串的类型定义块链串的类型定义typedef struct BNODE head; /* 头指针头指针
32、*/ int Strlen ; /* 当前长度当前长度 */ Blstring ; 在这种存储结构下,结点的分配总是完整的结点为单位,因在这种存储结构下,结点的分配总是完整的结点为单位,因此,为使一个串能存放在整数个结点中,在串的末尾填上不属于此,为使一个串能存放在整数个结点中,在串的末尾填上不属于串值的特殊字符,以表示串的终结。串值的特殊字符,以表示串的终结。 当一个块当一个块(结点结点)内存放多个字符时,往往会使操作过程变得内存放多个字符时,往往会使操作过程变得较为复杂,如在串中插入或删除字符操作时通常需要在块间移动较为复杂,如在串中插入或删除字符操作时通常需要在块间移动字符。字符。佛山科
33、学技术学院佛山科学技术学院 FoshanFoshan University University304.3 串的模式匹配算法串的模式匹配算法模式匹配模式匹配( (模范匹配模范匹配) ):子串在主串中的定位称为模式匹配或:子串在主串中的定位称为模式匹配或串匹配串匹配( (字符串匹配字符串匹配) ) 。模式匹配成功是指在主串。模式匹配成功是指在主串S中能够找中能够找到模式串到模式串T,否则,称模式串,否则,称模式串T在主串在主串S中不存在。中不存在。 模式匹配的应用在非常广泛。例如,在文本编辑程序中,模式匹配的应用在非常广泛。例如,在文本编辑程序中,我们经常要查找某一特定单词在文本中出现的位置。显
34、然,我们经常要查找某一特定单词在文本中出现的位置。显然,解此问题的有效算法能极大地提高文本编辑程序的响应性能。解此问题的有效算法能极大地提高文本编辑程序的响应性能。 模式匹配是一个较为复杂的串操作过程。迄今为止,人模式匹配是一个较为复杂的串操作过程。迄今为止,人们对串的模式匹配提出了许多思想和效率各不相同的计算机们对串的模式匹配提出了许多思想和效率各不相同的计算机算法。介绍两种主要的模式匹配算法。算法。介绍两种主要的模式匹配算法。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University314.3.1 Brute-Force模式匹配算法模式匹配算法
35、设设S为目标串,为目标串,T为模式串,且不妨设:为模式串,且不妨设:S=“s0s1s2sn-1” , T=“t0t1t2 tm-1” 串的匹配实际上是对合法的位置串的匹配实际上是对合法的位置0in-m依次将目标串中依次将目标串中的子串的子串sii+m-1和模式串和模式串t0m-1进行比较:进行比较: 若若sii+m-1=t0m-1:则称从位置:则称从位置i开始的匹配成功,开始的匹配成功,亦称模式亦称模式t在目标在目标s中出现;中出现; 若若sii+m-1t0m-1:从:从i开始的匹配失败。位置开始的匹配失败。位置i称称为位移,当为位移,当sii+m-1=t0m-1时,时,i称为有效位移;当称为
36、有效位移;当sii+m-1 t0m-1时,时,i称为无效位移。称为无效位移。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University32 这样,串匹配这样,串匹配问题可简化为找出某给定模式问题可简化为找出某给定模式T在给定目标串在给定目标串S中首次出现中首次出现的有效位移。的有效位移。int IndexString(StringType s , StringType t , int pos ) /* 采用顺序存储方式存储主串采用顺序存储方式存储主串s和模式和模式t, */ /* 若模式若模式t在主串在主串s中从第中从第pos位置开始有匹配的子串,位
37、置开始有匹配的子串,*/ /* 返回位置,否则返回返回位置,否则返回-1 */ char *p , *q ;int k , j ;k=pos-1 ; j=0 ; p=s.str+pos-1 ; q=t.str ; /* 初始匹配位置设置初始匹配位置设置 */ /* 顺序存放时第顺序存放时第pos位置的下标值为位置的下标值为pos-1 */佛山科学技术学院佛山科学技术学院 FoshanFoshan University University33while (ks.length)&(jt.length) if (*p=*q) p+ ; q+ ; k+ ; j+ ; else k=k-j+1
38、 ; j=0 ; q=t.str ; p=s.str+k ; /* 重新设置匹配位置重新设置匹配位置 */if (j=t.length) return(k-t.length) ; / * 匹配,返回位置匹配,返回位置 */else return(-1) ; /* 不匹配,返回不匹配,返回-1 */佛山科学技术学院佛山科学技术学院 FoshanFoshan University University34 该算法简单,易于理解。在一些场合的应用里,如文字处理该算法简单,易于理解。在一些场合的应用里,如文字处理中的文本编辑,其效率较高。中的文本编辑,其效率较高。 该算法的时间复杂度为该算法的时间复杂
39、度为O(n*m) ,其中,其中n 、m分别是主串和分别是主串和模式串的长度。通常情况下,实际运行过程中,该算法的执行时模式串的长度。通常情况下,实际运行过程中,该算法的执行时间近似于间近似于O(n+m) 。理解该算法的关键点理解该算法的关键点 当第一次当第一次sktj时:主串要退回到时:主串要退回到k-j+1的位置,而模式串也要的位置,而模式串也要退回到第一个字符(即退回到第一个字符(即j=0的位置)。的位置)。比较出现比较出现sktj时:则应该有时:则应该有sk-1=tj-1,sk-j+1=t1, sk-j=t0 。佛山科学技术学院佛山科学技术学院 FoshanFoshan Universi
40、ty University354.3.2 模式匹配的一种改进算法模式匹配的一种改进算法 该改进算法是由该改进算法是由D.E.Knuth ,J.H.Morris和和 V.R.Pratt提出提出来的,简称为来的,简称为KMP算法。其改进在于:算法。其改进在于: 每当一趟匹配过程出现字符不相等时,主串指示器不用回溯,每当一趟匹配过程出现字符不相等时,主串指示器不用回溯,而是利用已经得到的而是利用已经得到的“部分匹配部分匹配”结果,将模式串的指示器向右结果,将模式串的指示器向右“滑动滑动”尽可能远的一段距离后,继续进行比较。尽可能远的一段距离后,继续进行比较。例:设有串例:设有串s=“abacabab
41、” ,t=“abab” 。则第一次匹配过程如。则第一次匹配过程如图图4-2所示。所示。图图4-2 模式匹配示例模式匹配示例 s=“a b cbb” i=3 | | 匹配失败匹配失败 t=“a b b” j=3佛山科学技术学院佛山科学技术学院 FoshanFoshan University University36 在在i=3和和j=3时,匹配失败。但重新开始第二次匹配时,时,匹配失败。但重新开始第二次匹配时,不必从不必从i=1 ,j=0开始。因为开始。因为s1=t1,t0t1,必有,必有s1t0,又因,又因为为t0=t2,s2=t2,所以必有,所以必有s2=t0。由此可知,第二次匹配可。由此可
42、知,第二次匹配可以直接从以直接从i=3 、j=1开始。开始。 总之,在主串总之,在主串s与模式串与模式串t的匹配过程中,一旦出现的匹配过程中,一旦出现sitj ,主串主串s的指针不必回溯,而是直接与模式串的的指针不必回溯,而是直接与模式串的tk(0kj进行进行比较,而比较,而k的取值与主串的取值与主串s无关,只与模式串无关,只与模式串t本身的构成有本身的构成有关,即从模式串关,即从模式串t可求得可求得k值。值。)佛山科学技术学院佛山科学技术学院 FoshanFoshan University University37 不失一般性,设不失一般性,设主串主串s=“s1s2sn” ,模式串模式串t=
43、“t1 t2 tm” 。 当当sitj(1in-m,1jm,mn)时,主串时,主串s的指针的指针i不必回不必回溯,而模式串溯,而模式串t的指针的指针j回溯到第回溯到第k(kk满足满足4-1式。式。t1t2tk-1= si-(k-1) si-(k-2) si-2 si-1 (4-1)而已经得到的而已经得到的 “部分匹配部分匹配”的结果为:的结果为:tj-(k-1) tj-k tj-1=si-(k-1) si-(k-2) si-2 si-1 (4-2)由式由式(4-1)和式和式(4-2)得:得:t1t2tk-1=tj-(k-1) tj-k tj-1 (4-3) 该推导过程可用图该推导过程可用图4-
44、3形象描述。实际上,式形象描述。实际上,式(4-3)描述了模描述了模式串中存在相互重叠的子串的情况。式串中存在相互重叠的子串的情况。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University38图图4-3 KMP算法示例算法示例主串si模式串tkj0 当当j=1时时Maxk|1kjt1t2tk-1=tj-(k-1) tj-k tj-1 该集合不空时该集合不空时1 其它情况其它情况nextj=定义定义nextj函数为函数为佛山科学技术学院佛山科学技术学院 FoshanFoshan University University39在求得了在求得了nextj
45、值之后,值之后,KMP算法的思想是:算法的思想是: 设目标串设目标串(主串主串)为为s,模式串为,模式串为t ,并设,并设i指针和指针和j指针分别指指针分别指示目标串和模式串中正待比较的字符,设示目标串和模式串中正待比较的字符,设i和和j的初值均为的初值均为1。若。若有有si=tj,则,则i和和j分别加分别加1。否则,。否则,i不变,不变,j退回到退回到j=nextj的位的位置,再比较置,再比较si和和tj,若相等,则,若相等,则i和和j分别加分别加1。否则,。否则,i不变,不变,j再再次退回到次退回到j=nextj的位置,依此类推。直到下列两种可能:的位置,依此类推。直到下列两种可能:(1)
46、 j退回到某个下一个退回到某个下一个j值时字符比较相等,则指针各自值时字符比较相等,则指针各自加加1继续进行匹配。继续进行匹配。(2)退回到退回到j=0,将,将i和和j分别加分别加1,即从主串的下一个字符,即从主串的下一个字符si+1模式串的模式串的t1重新开始匹配。重新开始匹配。佛山科学技术学院佛山科学技术学院 FoshanFoshan University University40#define Max_Strlen 1024int nextMax_Strlen;int KMP_index (StringType s , StringType t) /* 用用KMP算法进行模式匹配,匹配返回位置,否则返回算法进行模式匹配,匹配返回位置,否则返回-1 */ /*用静态存储方式保存字符串,用静态存储方式保存字符串, s和和t分别表示主串和模式串分别表示主串和模式串 */ int k=0 , j=
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉林师范大学《美术概论》2021-2022学年第一学期期末试卷
- 吉林师范大学《环境影响评价技术导则》2021-2022学年第一学期期末试卷
- 阳光房压型铝合金板施工和保温方案
- 吉林师范大学《地图学》2021-2022学年第一学期期末试卷
- 吉林大学《英汉翻译基础》2021-2022学年第一学期期末试卷
- 吉林大学《外科总论E》2021-2022学年第一学期期末试卷
- 幼儿园食品安全责任管理制度
- 2024工商注册房屋租赁合同
- 商业综合体绿化景观设计施工方案
- 吉林大学《软件工程专业导论》2021-2022学年期末试卷
- 2024-2025学年第一学期初二物理期中考试卷
- 统编版2024-2025学年四年级语文上册期中素养测评基础卷 (含答案)
- 苏教版九年级上册劳动技术+第21课+垃圾分类与资源回收【课件】
- DB11T 1359-2016 平原生态公益林养护技术导则
- 江苏省南京市六校联考2024-2025学年高一上学期期中考试语文试题(无答案)
- 预防校园欺凌主题班会课件(共36张课件)
- 2024年福建闽投永安抽水蓄能有限公司招聘笔试参考题库附带答案详解
- 成长生涯发展展示
- 求职能力展示
- 城轨行车组织-工程列车的开行
- 火灾逃生与自救
评论
0/150
提交评论