数 据 结 构 刘家芬 Sept 2012.

Slides:



Advertisements
Similar presentations
2.8 函数的微分 1 微分的定义 2 微分的几何意义 3 微分公式与微分运算法则 4 微分在近似计算中的应用.
Advertisements

数据结构的引入. 通讯录管理 社团机构管理 校园导航管理 通讯录管理 社团机构管理 校园导航管理.
练一练: 在数轴上画出表示下列各数的点, 并指出这些点相互间的关系: -6 , 6 , -3 , 3 , -1.5, 1.5.
第六 章数据库访问页 6.1 数据访问页视图 6.2 创建数据访问页 6.3 编辑数据访问页 6.4 查看数据访问页 退出.
数据结构与算法 (C++语言版) 第4章 串.
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第九章 字符串.
第三章 多维随机变量及其分布 §2 边缘分布 边缘分布函数 边缘分布律 边缘概率密度.
第四章 串 2018/11/13.
数据结构 Data Structure 主讲人:王国军,郑瑾 中南大学 中南大学信息院计科系
第4章 串、数组和广义表 丽水学院工学院.
Hadoop I/O By ShiChaojie.
C语言高级编程(第四部分) 字符串 北京大学 信息科学技术学院.
强连通分量 无向图 1、任意两顶点连通称该图为连通图 2、否则将其中的极大连通子图称为连通分量 A D C B E 有向图
数据结构——串 1/15.
第四章 串和数组(一) 1/.
辅导课程六.
串和数组.
第4章 串 4.1 串的基本概念及其抽象数据 4.2 串的存储结构 4.3 串类 4.4 串的模式匹配算法.
第一单元 初识C程序与C程序开发平台搭建 ---观其大略
§2 求导法则 2.1 求导数的四则运算法则 下面分三部分加以证明, 并同时给出相应的推论和例题 .
4.1 串的抽象数据类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法.
第4章 串 4.1 串的基本概念 4.2 串的存储结构 4.3 串的模式匹配.
模式匹配算法的原理及应用.
第二章 Java语言基础.
逆向工程-汇编语言
动态规划(Dynamic Programming)
数据结构概论 第4章 串 董黎刚 浙江工商大学信电学院 2019年1月18日.
用event class 从input的root文件中,由DmpDataBuffer::ReadObject读取数据的问题
第4章 串和数组 本章主要介绍下列内容: 串的定义、存储结构和基本运算 数组的定义、基本运算和存储结构 特殊矩阵的压缩存储.
从zval看PHP变量
第一章 函数与极限.
第四章 串.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
C语言程序设计 主讲教师:陆幼利.
学习目标 1、什么是字符集 2、字符集四个级别 3、如何选择字符集.
顺序表的删除.
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
本节内容 随机读取 视频提供:昆山爱达人信息技术有限公司.
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
第二章 Java基本语法 讲师:复凡.
VB与Access数据库的连接.
5.1 串的基本概念 5.2 串的存储结构 5.3 串的基本运算 5.4 模式匹配 5.5 串在文本编辑中的应用
第四章 串和数组 4.1 串的定义* 4.2 串的表示和实现* 4.3 数组 4.4 数组的压缩.
单链表的基本概念.
第 四 讲 线性表(二).
成绩是怎么算出来的? 16级第一学期半期考试成绩 班级 姓名 语文 数学 英语 政治 历史 地理 物理 化学 生物 总分 1 张三1 115
第六章 Excel的应用 一、Excel的单元格与区域 1、单元格:H8, D7, IV26等 2、区域:H2..D8, HS98:IT77
第4章 Excel电子表格制作软件 4.4 函数(一).
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
3.16 枚举算法及其程序实现 ——数组的作用.
第四章 串 £4.1 串的定义 £4.2 串的顺序存储结构 £4.3 串的链式存储结构 £4.4 串的应用—文本编辑
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
C++语言程序设计 C++语言程序设计 第六章 指针和引用 第十一组 C++语言程序设计.
第一章 绪论 1.1 引言 1.2 逻辑结构和存储结构 1.3 算法.
2.6 字符型数据 一、 字符常量 1、字符常量的定义 用一对单引号括起来的单个字符,称为字符常量。 例如,‘A’、‘1’、‘+’等。
分数再认识三 真假带分数的练习课.
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
第五章 串和数组 5.1 串的定义和操作 5.2 串的表示和实现 5.3 正文匹配模式 5.4 正文编辑 5.5 数组 5.6 数组的压缩.
_03宽字符与Unicode编程 本节课讲师——void* 视频提供:昆山爱达人信息技术有限公司 官网地址:
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
第四章 串 String
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
本节内容 进程 视频提供:昆山爱达人信息技术有限公司 官网地址: 联系QQ: QQ交流群 : 联系电话:
使用Fragment 本讲大纲: 1、创建Fragment 2、在Activity中添加Fragment
顺序结构程序设计 ——关于“字符串”和数值.
第5章 其他线性数据结构.
最小生成树 最优二叉树.
§2 自由代数 定义19.7:设X是集合,G是一个T-代数,为X到G的函数,若对每个T-代数A和X到A的函数,都存在唯一的G到A的同态映射,使得=,则称G(更严格的说是(G,))是生成集X上的自由T-代数。X中的元素称为生成元。 A变, 变 变, 也变 对给定的 和A,是唯一的.
Presentation transcript:

数 据 结 构 刘家芬 Sept 2012

第四章 串 本章目标 在非数值处理、事务处理等问题常涉及到一系列的字符操作。字符串的处理比单纯数值处理复杂。 串的定义 例如:文字编辑系统、编译程序、图像、音乐处理、信息检索等。 本章目标 串的定义 串的存储结构和操作实现 *串的模式匹配算法

串的概念 串(字符串):是零个或多个字符组成的有限序列。记作: S=‘a1a2a3…’。 S是串名,单引号括起来的字符序列是串值。 ai(1≦i≦n) 可以是单个字母、数字或其它字符 串长:串中所包含的字符个数称为该串的长度 空串(空的字符串):长度为零的串称为空串,它不包含任何字符。 空格串(空白串):构成串的所有字符都是空格的串称为空白串。 注意空串和空白串的不同,例如“ ”和“”分别表示长度为1的空白串和长度为0的空串。

子串的概念 串中任意个连续字符组成的子序列称为该串的子串,包含子串的串相应地称为主串。 通常将子串在主串中首次出现时的该子串的首字符对应的主串中的序号,定义为子串在主串中的序号(或位置)。 例如,设A和B分别为 A=“This is a string” B=“is” 则B是A的子串,A为主串。B在A中的序号是? B在A中出现了两次,其中首次出现所对应的主串位置是3。称B在A中的序号(或位置)为3。 空串是任意串的子串,任意串是其自身的子串。

串相等 串相等:如果两个串的串值相等(相同),称这两个串相等。只有当两个串的长度相等,且各个对应位置的字符都相同时才相等。 串值可用单引号或双引号括起来,但引号本身不属于串,用于区分串的边界而已。

串常量和串变量 通常在程序中使用的串可分为两种:串变量和串常量。 串常量在程序中只能被引用,不能改变其值,即只能读不能写。例如C语言中的printf("Succeed!") 串变量和其它类型的变量一样,其值可以改变。

串的抽象数据类型定义 ADT String{ 数据对象:D = { ai|ai∈CharacterSet, i=1,2,…,n, n ≥0 } 数据关系:R = {<ai-1, ai>| ai-1, ai∈D, i=2,3,…,n } 基本操作: // 13种 StrAssign(&T, chars) // 串赋值 StrCompare(S,T) // 串比较 StrLength(S) // 求串长 Concat(&T, S1, S2) // 串连接 SubString(&Sub, S, pos, len) // 求子串 …… Index(S, T, pos) // 返回子串位置 Replace(&S, T,V) // 替换子串 }ADT Sting

串的基本操作 这些基本操作同样需要由设计人员根据需求和存储方式自行实现。 在基本操作的基础上可以实现更为复杂的操作。 前五种构成最小操作子集。即这些操作不能利用其它操作来实现,而其它操作可由最小操作子集实现。

基本操作子集

定位函数的实现 例如定位函数Index(S,T,pos)可由求子串和串比较操作配合实现。查看母串S中是否存在和T匹配的子串,若存在返回它在主串S中第一次出现的位置,否则返回0。 假设S=‘abcaabda’ ,T=‘abda’, 如何实现? 思想:从母串S中的第一个字符开始的Length(T)个字符与子串T比较,若相等,则返回1;否则再从S中第二个字符开始的Length(T)个字符与子串T比较,如此反复,直到匹配成功或主串S中的字符已被取尽。

串定位

串的存储表示和实现 串是一种特殊的线性表,其存储表示和线性表类似,但又不完全相同。 串在计算机中有3种表示方式: 定长顺序存储表示:将串定义成字符数组,利用串名可以直接访问串值。用这种表示方式,串的存储空间在编译时确定,其大小不能改变。 堆分配存储方式:仍然用一组地址连续的存储单元来依次存储串中的字符序列,但串的存储空间是在程序运行时根据串的实际长度动态分配的。 块链存储方式:是一种链式存储结构表示。

串的定长顺序存储表示 又称为串的顺序存储结构,用一组连续的存储单元来存放串中的字符序列。所谓定长顺序存储结构,是直接使用定长的字符数组来定义,数组的大小预先确定。 串的实际长度在255以内,超过部分将被舍去,称为“截断”。 串长的两种表示: 用下标为0的数组元素存放串的长度,如PASCAL语言 用一个特殊符号例如\0表示串结束,该符号不计入串长度,如C语言

定长顺序存储下的基本操作 串链接Concat(&T,S1,S2)的实现非常直观,执行串复制操作即可。但要注意根据串的长度进行截断操作。

定长顺序存储下的基本操作 串链接Concat(&T,S1,S2)的实现非常直观,执行串复制操作即可。但要注意根据串的长度进行截断操作。

定长顺序存储下的基本操作 串链接Concat(&T,S1,S2)的实现非常直观,执行串复制操作即可。但要注意根据串的长度进行截断操作。

求子串

串的堆分配存储表示 这种存储表示的特点是:仍然以一组地址连续的存储空间来存储字符串值,但其所需的存储空间是在程序执行过程中动态分配的。 实现方法:系统提供一个空间足够大且地址连续的存储空间(称为“堆”), 并由C语言的动态存储分配函数malloc()和free()来管理。 用malloc()为每个串分配一块实际串长所需的存储空间,并返回一个指向起始地址的指针作为基址。为了方便,串长也作为串结构的一部分。

堆分配存储表示下基本操作的实现

堆分配存储表示下基本操作的实现

堆分配存储表示下基本操作的实现

堆分配存储表示下基本操作的实现

堆分配存储表示下基本操作的实现

串的链式存储 串的链式存储结构和线性表的串的链式存储结构类似,采用单链表来存储串,结点的构成是 data域:存放字符,data域可存放的字符个数称为结点的大小; next域:存放指向下一结点的指针。 若每个结点仅存放一个字符,则结点的指针域就非常多,造成系统空间浪费,为节省存储空间,考虑串结构的特殊性,使每个结点存放若干个字符,这种结构称为块链结构。

串的块链结构 当结点大小大于1时,串长不一定是结点大小的整数倍,块链的最后一个结点不一定占满,可用#或其他特殊字符填充。

串的块链存储 为了便于实现串的联接等操作,用链表存储串时,除了头指针用于指示链表的开头,又附设一个尾指针指示链表的最后一个结点。

串的模式匹配算法 模式匹配:子串在主串中的定位,也叫字符串匹配。模式匹配成功是指在主串S中能够找到模式串T,否则,称模式串T在主串S中不存在。 模式匹配的应用在非常广泛。例如,在文本编辑程序中,我们经常要查找某一特定单词在文本中出现的位置。 模式匹配算法的研究能极大地提高文本编辑程序的响应性能。

串的模式匹配算法BF

串的模式匹配算法BF 该算法的关键点: 当t和s碰上第一个不匹配的字符时:主串要退回到i-j+2的位置,而模式串也要退回到第一个字符(即j=1的位置)。

串的模式匹配算法KMP 考虑s=“00000000000000000000000001” t=“0000001” 每当一趟匹配过程出现字符不相等时,主串指示器不用回溯,而是利用已经得到的“部分匹配”结果,将模式串的指示器向右“滑动”尽可能远的一段距离后继续进行比较。

串的模式匹配算法KMP

串的模式匹配算法KMP 模式串t的前k-1个字符必须满足下式,而且不可能存在k’>k满足该式。 而已经得到的 “部分匹配”的结果为: 设主串s=“s1s2…sn” ,模式串t=“t1t2 …tm” 。当si≠tj (1≦i≦n-m,1≦j<m)时,主串s的指针i不必回溯,模式串t的指针j回溯到第k(k<j)个字符继续比较。 模式串t的前k-1个字符必须满足下式,而且不可能存在k’>k满足该式。 t1t2…tk-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)得: t1t2…tk-1=tj-(k-1) tj-k… tj-1 (4-3)

Max{k|1<k<j∧t1t2…tk-1=tj-(k-1) tj-k… tj-1 } 该集合不空时 串的模式匹配算法KMP 0 当j=1时 Max{k|1<k<j∧t1t2…tk-1=tj-(k-1) tj-k… tj-1 } 该集合不空时 1 其它情况 next[j]= 定义next[j]函数为

KMP函数思想 求得next[j]值之后,KMP算法的思想: 目标串(主串)为s,模式串为t ,并设i指针和j指针分别指示目标串和模式串中正待比较的字符,设i和j的初值均为1。 若有si=tj,则i和j分别加1。 否则,i不变,j退回到j=next[j]的位置,再比较si和tj 若相等,则i和j分别加1 否则,i不变,j再次退回到j=next[j]的位置。 依此类推。

KMP函数思想 直到下列两种可能: (1)j退回到某个下一个[j]值时字符比较相等,则指针各自加1继续进行匹配。 (2)退回到j=0,将i和j分别加1,即从主串的下一个字符si+1模式串的t1重新开始匹配。

KMP算法示例

KMP的实现

Have FUN !