5-0、6-0 串,数组和广义表
串的基本概念,存储方式、模式匹配算法
广义表的表长、表头表尾、链式存储
串是以字符为元素的线性表
4.1 串类型的定义
4.2 串的表示和实现
4.2.1 定长顺序存储表示
4.2.2 堆分配存储表示
4.3 串的模式匹配算法
串
串类型的定义
基本概念
串(字符串 string):
由零个或多个字符组成的有限序列
记为: s =‘a1a2...an’ (n ≥ 0)
ai(1≤i≤n)是字母,数字或其它字符
串名: s为串名
串值:‘a1a2…an’为串值
长度:n称为串的长度
空串:n=0的串称为空串(Null string)记为:Ф
空白串:通常将仅由一个或多个空格组成的串称为空白串(Blank String)
注意:空串和空白串的不同,例如“ ”和“”分别表示长度为1的空白串和长度为0的空串。
子串:串中任意个连续字符组成的序列;
位置:字符在序列中的序号
子串的位置:子串第一个字符在主串中的位置
ADT
ADT String {
数据对象:D = {ai | ai∈CharacterSet,i=1,2,...n, n>=0}
数据关系: R1= {<ai-1., aj>| ai ∈D, i=2,...n}。
基本操作:
StrAssign(&T,chars)
初始条件: chars是字符串常量。
操作结果: 生成一个其值等于chars的串T。
StrCopy(&T,S)
初始条件: 字符串S已经存在。
操作结果: 由串S复制得串T。
StrEmpty (S)
初始条件: 字符串S已经存在。
操作结果: 若S为空串,则返回TRUE,否则返回FALSE。
StrCompare(S,T)
初始条件: 字符串S和T存在。
操作结果: 若S>T,则返回值>0;若S=T,则返回值=0;否则返回值<0。
StrLength(S)
初始条件: 字符串S已经存在。
操作结果: 返回串S元素个数,称为串的长度。
ClearString(&S)
初始条件: 字符串S已经存在。
操作结果: 将串S清为空串。
Concat(&T,S1,S2)
初始条件: 字符串S1,S2已经存在。
操作结果: 用T返回由串S1和S2联结而成的新串。
Substring(&Sub,S,pos,len)
初始条件: 串S存在,1<=pos<=S的长度,0<=len<=S的长度-pos+1。
操作结果: 用Sub返回串S的第pos个字符起长度为len的子串。
Index(S,T,pos)
初始条件: 串S和T存在,T是非空串,1<=pos<=S的长度。
操作结果: 若主串S中存在和串T相同的子串,则返回它在主串S中第pos个字符之后第一次出现的位置;否则返回0。
Replace(&S,T,V)
初始条件: 字符串S,T,V已经存在,T是非空串。
操作结果: 用V替换主串S中出现的所有与T相等的不重叠的子串。
StrInsert(&S,pos,T)
初始条件: 字符串S,T存在,1<=pos<=S的长度+1。
操作结果: 在串S的第pos个字符之前插入串T。
StrDelete(&S,pos,len)
初始条件: 串S存在,1<=pos<=S的长度-len+1。
操作结果: 从串S中删除第pos个字符起长度为len的子串。
DestroyString(&S): 把存在的串S销毁。
}ADT String
串类型的最小操作子集
下面5种操作构成最小操作子集:
串赋值 StrAssign;
串比较 StrCompare;
求串长 StrLength;
串联结 Concat;
求子串 Substring;
串的表示和实现
顺序表示
定长顺序表示
用连续的存储单元存储串,存储单元的长度固定。
堆分配存贮表示
特点:仍用连续的存储单元存储串,但存储空间是在程序执行过程中动态分配而得。
链式表示
块链存贮表示
一个结点的数据域不仅放一个数据元素(字符),而是放多个数据元素。
串的模式匹配算法
求子串位置的定位函数:子串的定位操作通常称作串的模式匹配(其中T被称模式串),是各种串处理系统中最重要的操作之一。
算法分析
设n = StrLength(S);m = StrLength(T);
最好情况的复杂度为O(n+m);
最坏情况的复杂度为O(n*m)。
KMP算法
模式匹配的一种改进算法
KMP算法的改进在于:
- 每一趟匹配过程中出现字符比较不等时,不需要回朔i指针
- 只要利用已经“部分匹配”结果,调整j指针,即将模式向右滑动尽可能远的一段距离,来个提高算法效率.
数组和广义表
定义
数组可以看成是一种特殊的线性表,即线性表中数据元素本身也是一个线性表。
ADT
ADT Array{
数据对象:D={aj1j2…jn|n(>0)称为数组的维数,
bi 是数组第i维的长度
ji 是数组元素的第i维下标,
ji = 0, …, bi – 1, i = 1, 2, …, n,
aj1j2…jn ∈ ElemSet }
数据关系:R = {R1, R2, … Rn}
Ri = { <a j1…ji…jn, aj1…ji+1…jn>|
0≤jk ≤ bk-1, 1 ≤k ≤n 且k ≠i,
0 ≤ji ≤bi –2,
aj1…ji…jn, aj1…ji+1…jn ∈ D, i = 2, …, n }
基本操作:
InitArray(&A,n,b1,…,bn ); // 初始化
DestroyArray(&A ); // 销毁
Value( A, &e, i1, i2, … in); // 取值
Assign( &A, e, i1, i2, … in); // 赋值
}// Array
数组的顺序存储结构
主序存放
- 按列序为主序存放
- 按行序为主序存放
n维数组的存储地址计算公式
矩阵的压缩存储
- 矩阵: 二维数组
- 特殊矩阵: 大量重复元素或大量0元素
- 稀疏矩阵: 大量0元素
- 压缩存储: 重复元素只分配一个存储空间,0元素不分配存储空间
对称矩阵
三角矩阵
下三角矩阵
对角矩阵
稀疏矩阵
- 定义:非零元素较少,且分布没有一定规律的矩阵
- 压缩存储原则:只存矩阵的行列维数和每个非零元素的行列下标及其值
通常稀疏因子<0.05时称为稀疏矩阵
稀疏矩阵的压缩存储方法
顺序存储结构:三元组表
链式存储结构:十字链表
广义表
定义
- 广义表:LS = ( α1, α2, … αn)
- αi 可以是单个数据元素,也可以是广义表。
- 广义表是由n个数据元素构成的一个表,其数据元素可以是单个数据元素,也可以是一个广义表。
- n 长度;
若αi为单个元素,称为原子;否则子表
α1为表头,其余元素组成的表为表尾
表长
最大括号内的逗号数+1
特别地,E = ( a, E ); 递归表,长度为2
广义表的链式存储结构
广义表不能使用顺序存储,只能链式存储。