5-0、6-0 串,数组和广义表


title: 数据结构 | 串,数组和广义表
date: 2019-12-13 09:53:17
tags: 数据结构


串的基本概念,存储方式、模式匹配算法
广义表的表长、表头表尾、链式存储

串是以字符为元素的线性表
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

广义表的链式存储结构

广义表不能使用顺序存储,只能链式存储。

原文地址:https://www.cnblogs.com/nightland/p/13504407.html