数据结构与算法分析~笔记4串

本文详细介绍了串(字符串)的基本概念,包括其定义、存储结构(顺序存储、堆分配和链式存储)以及在编程中的应用,重点讨论了模式匹配的BF和KMP方法。
摘要由CSDN通过智能技术生成

串是字符串的简称,它是一种重要的线性结构。从数据结构角度来说,串也是线性表,其特殊性在于串是由字符构成的序列。其广泛应用于汇编和高级语言的编译程序中,源程序和目标程序均为字符串数据。又如信息检索系统、文字编辑程序、问答系统、自然语言处理系统等,均是以字符串数据作为处理对象的。

4.1 串的基本概念

(String)是由零个或多个字符组成的有限序列。非空串一般记作:s=“a1a2a3…an”(n≥1),其中s是串名,双引号引起来的字符序列是串值。ai(1≤i≤n)可以是字母、数字或其他字符;串中所包含的字符个数称为串的长度。长度为0的串称为空串(Null String),即双引号中无任何字符。通常将仅由一个或多个空格组成的串称为空格串。
注意:空串和空格串不同。
串中任意个连续字符组成的子序列称为该串的子串,包含子串的串称为主串。子串的首字符在主串中的序号称为子串在主串中的位置。
空串是任意串的子串,串总是其自身的子串。通常在程序中使用的串可分为两种:串常量和串变量。
串常量在程序中只能被引用但不能改变其值,即只能读不能写。而串变量和其他类型的变量一样,其取值是可以改变的。

4.2 串的表示与实现

因为串是特殊的线性表,故其存储结构与线性表的存储结构类似。其特殊性仅在于组成串的结点是单个字符。串有3种存储表示方法:定长顺序存储、堆分配存储和链式存储。
定长顺序存储表示,也称为静态存储分配的顺序表。它用一组连续的存储单元来存放串中的字符序列。所谓定长顺序存储结构,是指直接使用定长的字符数组来实现。
一般可使用一个不会出现在串中的特殊字符在串值的尾部来表示串的结束。例如,C/C++语言中以字符‵\0′表示串值的终结。
在实际应用中,串变量的长度变化较大,往往会造成存储空间“溢出”。因此,为解决此类问题,可采用堆分配存储表示方法。堆分配存储表示的特点是,仍以一组地址连续的存储单元存放串字符序列,但它们的存储空间是在程序执行过程中动态分配的。
系统提供一个连续的称为“堆”的自由存储区,作为串的存储空间。当建立一个新串时,就在这个存储空间中为新串分配一个连续的存储空间。在C++语言中,动态分配用new和delete来管理。
串也可用链表存储,串的这种链式存储结构简称为链串(Linked String)。这种结构便于进行插入和删除运算,但存储空间利用率较低。
链串中的结点可以存放一个字符,也可存放多个字符。例如图(a)所示为结点大小是1(即结点存放一个字符)的链表,图(b)所示为结点大小是4的链表。如果串长不是结点大小的整数倍,则最后几个空结点用“#”补满。
在这里插入图片描述
为便于进行串的操作,当以链表存储串值时,除头指针外还附设一个尾指针指示链串的最后一个结点,并给出当前串中的结点个数,即串的长度。

4.3 串的模式匹配

设S和T是两个给定的串,在串S中找等于T的子串的过程称为模式匹配(Pattern Matching)。S一般称为主串目标串,T称为模式串。如果找到,称为匹配成功,否则称为匹配失败
模式匹配方法BF
BF方法的全称是Brute-Force,也称为简单匹配方法。设S为主串,T为模式串,且形式为:S=“s0s1…sn-1"和T=“t0t1…tm-1”。
BF模式匹配方法的基本思路是:对于合法的位置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开始的匹配失败。
具体操作中:从主串S的第一个字符开始,与模式串T中的第一个字符比较,若相等,则继续逐个比较后续字符;否则从主串S的第二个字符开始重新与模式串T的第一个字符进行比较。依次类推,若主串S的第i个字符开始,每个字符依次和模式串T中的对应字符相等,则匹配成功,返回i;否则,匹配失败,返回-1。
模式匹配方法KMP
KMP方法的全称是Knuth-Morris-Pratt,它由D.E. Knuth、J.H.Morris和V.R. Pratt共同提出。KMP方法较BF模式匹配有较大改进,其改进思想在于:每当一趟匹配过程中出现字符比较不相等时,不需要回溯i指针,而是利用已经得到的“部分匹配”的结果将模式向右移动尽可能多的距离后,再继续比较。
一般情况下,设主串为"s1s2…sn”,模式串为"t1t2…tm",当si≠tj时,主串s的指针不必回溯。而模式串t的指针j回溯到第k(k<j)个字符继续比较,则模式串t的前k-1个字符必需满足:
在这里插入图片描述
已经得到的部分匹配结果为:
在这里插入图片描述
合并上述式子得:
在这里插入图片描述
若令next(j)=k,则next(j)表明当模式串第j个字符与主串中相应的字符“失配”时,在模式中需重新和主串中该字符进行比较的字符位置。next(j)定义如下:
在这里插入图片描述
KMP的匹配过程如下。
设主串为s,模式串为t,并设i和j分别指向主串和模式串中正待比较的字符,i和j的初值均为1。若si=tj,则i和j分别加1;否则i不变,j退回到next(j)位置。再比较si和tj,若相等,则i和j分别加1;否则i不变,j再退回到next(j)位置。依次类推,直至下列两种可能:
(1)j退回到某个next(j)值时字符比较相等,则指针各自加1,继续进行匹配;
(2)退回到j=0,将i和j分别加1,即从主串的下一个字符si+1与模式串中的t1重新开始匹配。

  • 15
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值