第5章 其他线性数据结构.

Slides:



Advertisements
Similar presentations
数据结构 2014年3月.
Advertisements

§1 二阶与三阶行列式 ★二元线性方程组与二阶行列式 ★三阶行列式
一、二阶行列式的引入 用消元法解二元线性方程组. 一、二阶行列式的引入 用消元法解二元线性方程组.
第五章 数组和广义表.
第一章 行列式 第五节 Cramer定理 设含有n 个未知量的n个方程构成的线性方程组为 (Ⅰ) 由未知数的系数组成的n阶行列式
初中数学八年级下册 (苏科版) 10.4 探索三角形 相似的条件(2).
C++中的声音处理 在传统Turbo C环境中,如果想用C语言控制电脑发声,可以用Sound函数。在VC6.6环境中如果想控制电脑发声则采用Beep函数。原型为: Beep(频率,持续时间) , 单位毫秒 暂停程序执行使用Sleep函数 Sleep(持续时间), 单位毫秒 引用这两个函数时,必须包含头文件
第九章 字符串.
第三章 多维随机变量及其分布 §2 边缘分布 边缘分布函数 边缘分布律 边缘概率密度.
第四章 串 2018/11/13.
Hadoop I/O By ShiChaojie.
第二章 矩阵(matrix) 第8次课.
第五章 数组和 广义表 数组 稀疏矩阵 广义表.
第 4章 串和数组(二) 本讲主要内容: 数组的定义及其顺序表示和实现。 矩阵的压缩存储。 广义表的定义。
数据结构——串 1/15.
第四章 串和数组(一) 1/.
辅导课程六.
串和数组.
元素替换法 ——行列式按行(列)展开(推论)
Zhao4zhong1 (赵中) C语言指针与汇编语言地址.
§2 求导法则 2.1 求导数的四则运算法则 下面分三部分加以证明, 并同时给出相应的推论和例题 .
第4章 串、数组和广义表 4.1 串 4.2 数组 4.3 广义表.
4.1 串的抽象数据类型的定义 4.2 串的表示和实现 4.3 串的模式匹配算法.
第4章 串 4.1 串的基本概念 4.2 串的存储结构 4.3 串的模式匹配.
动态规划(Dynamic Programming)
第五章 习题课 电子信息与计算机科学系 曾庆尚.
第4章 串和数组 本章主要介绍下列内容: 串的定义、存储结构和基本运算 数组的定义、基本运算和存储结构 特殊矩阵的压缩存储.
顺序表的插入.
第五章 数组 5.1 数组的定义 5.2 数组的表示和实现* 5.3 数组的压缩.
第4章 非线性规划 4.5 约束最优化方法 2019/4/6 山东大学 软件学院.
第四章 串.
C++语言程序设计 C++语言程序设计 第七章 类与对象 第十一组 C++语言程序设计.
数列.
实数与向量的积.
线段的有关计算.
顺序表的删除.
线性代数 第二章 矩阵 §1 矩阵的定义 定义:m×n个数排成的数表 3) 零矩阵: 4) n阶方阵:An=[aij]n×n
线 性 代 数 厦门大学线性代数教学组 2019年4月24日6时8分 / 45.
第5章 数组和广义表 本章主题:多维数组、特殊矩阵和广义表 教学目的:掌握数组和广义表的定义、运算及存储结构 教学难点:矩阵的压缩存储
5.1 串的基本概念 5.2 串的存储结构 5.3 串的基本运算 5.4 模式匹配 5.5 串在文本编辑中的应用
数 据 结 构 刘家芬 Sept 2012.
第四章 串和数组 4.1 串的定义* 4.2 串的表示和实现* 4.3 数组 4.4 数组的压缩.
单链表的基本概念.
顺序查找.
用计算器开方.
第4章 Excel电子表格制作软件 4.4 函数(一).
复习: 若A(x1,y1,z1) , B(x2,y2,z2), 则 AB = OB - OA=(x2-x1 , y2-y1 , z2-z1)
§8.3 不变因子 一、行列式因子 二、不变因子.
§6.7 子空间的直和 一、直和的定义 二、直和的判定 三、多个子空间的直和.
3.1.2 空间向量的数量积运算 1.了解空间向量夹角的概念及表示方法. 2.掌握空间向量数量积的计算方法及应用.
3.16 枚举算法及其程序实现 ——数组的作用.
第四章 串 £4.1 串的定义 £4.2 串的顺序存储结构 £4.3 串的链式存储结构 £4.4 串的应用—文本编辑
1.2 子集、补集、全集习题课.
多层循环 Private Sub Command1_Click() Dim i As Integer, j As Integer
2.2矩阵的代数运算.
第15讲 特征值与特征向量的性质 主要内容:特征值与特征向量的性质.
线 性 代 数 厦门大学线性代数教学组 2019年5月12日4时19分 / 45.
第五章 串和数组 5.1 串的定义和操作 5.2 串的表示和实现 5.3 正文匹配模式 5.4 正文编辑 5.5 数组 5.6 数组的压缩.
Ch.5 数组和广义表 黄刘生 中国科学技术大学计算机系 国家高性能计算中心(合肥)
§2 方阵的特征值与特征向量.
实验目的:掌握数据的顺序存储结构及它们在计算机中的操作。 实验内容:
第四章 串 String
基于列存储的RDF数据管理 朱敏
C++语言程序设计 C++语言程序设计 第一章 C++语言概述 第十一组 C++语言程序设计.
数据结构概论 第5章 数组和广义表 董黎刚 浙江工商大学信电学院.
定义5 把矩阵 A 的行换成同序数的列得到的矩阵,
第三节 数量积 向量积 混合积 一、向量的数量积 二、向量的向量积 三、向量的混合积 四、小结 思考题.
§4.5 最大公因式的矩阵求法( Ⅱ ).
第二章 线性表 东南大学计算机学院 方效林 本课件借鉴了清华大学殷人昆老师 和哈尔滨工业大学张岩老师的课件.
学习目标 1、什么是列类型 2、列类型之数值类型.
Presentation transcript:

第5章 其他线性数据结构

第5章 其他线性数据结构 5.1 串 5.2 多维数组 5.3 应用举例及分析 习题

5.1 串 5.1.1 串的定义及基本操作 串是由零个或多个字符组成的有限序列。用线性表表示,标记为: S=‘a1,a2,a3,……an’ (n>=0) 串长度:串中的字符个数。引号不是串的内容。 空串:长度为0的串。空格串不是空串。 子串:串中连续字符组成的子序列。 子串在主串中的位置:以第一个字符出现位置标识。 空串是任何串的子串,任何串是自身的子串。 子串相等:两串的长度相等,并且对应字符都相等。

5.1.2 串的存储结构 定长顺序存储表示(静态数组结构) 堆分配存储表示(动态数组结构) 串的链式存储表结构 串的操作对象:串与线性表的运算有所不同,是以“串的整体”作为操作对象,例如查找某子串,在主串某位置上插入一个子串等。 串的存储结构:可分为顺序存储、链式存储。此处仅介绍顺序存储。 定长顺序存储表示(静态数组结构) ——用一组地址连续的存储单元存储串值的字符序列,属静态存储方式。 堆分配存储表示(动态数组结构) ——用一组地址连续的存储单元存储串值的字符序列,但存储空间是在程序执行过程中动态分配而得。 串的链式存储表结构 顺序存储 链式存储

5.1.3 串的基本操作的实现 1、在串的顺序定长存储结构上实现CONCAT(S,T1,T2) 在操作时需考虑可能出现的三种情况: 串T1和串T2的长度之和小于MAXSIZE,即两串联接得到的S串是T1串和T2串联接的正常结果,S串的长度等于T1串和T2串的长度之和。 串T1的长度小于MAXSIZE,而串T1和串T2的长度之和大于MAXSIZE,则两串联接得到的S串是T1串和T2串的一个子串的联接,串T2 的后面部分被截断。 S串的长度等于MAXSIZE。 串T1的长度等于MAXSIZE,则两串联接得到的S串是T1串的拷贝,串T2 全部被截断。S串的长度等于MAXSIZE。

2、在串的堆分配结构上实现CONCAT(S,T1,T2)操作 算法如下: void concat_h(HSTRING s, HSTRING t1, HSTRING t2) { int I; s.ch=malloc((t1.len+t2.len)*sizeof(char)); for(i=1;i<=t1.len;i++) s.ch[i]=t1.ch[i]; for(i=1;i<=t2.len;i++) s.ch[i+t1.ch]=t2.ch[i]; s.len=t1.len+t2.len; }

3、在串的顺序定长存储结构上实现子串的定位操作INDEX(S,T) 定位操作:子串的定位操作通常称作串的模式匹配,用于得到子串在主串中的位置。 定位函数的算法思路:在主串S中从i=1开始取一长度和串T长度相等的子串与串T进行比较,若相等,则函数返回i;否则i增加1,从i=2开始取一长度和串T长度相等的子串与串T进行比较,重复上述的过程,直至确定在串S中取不到和串T长度相等的子串为止,函数返回0。或在S中取到一个和串T相等的子串,函数返回i。

串小结 串是一种特殊的线性表,由有限的字符序列组成。串的应用非常广泛,凡是涉及到字符处理的领域都要用到串。很多高级语言和字符处理软件都具有较强的串处理的功能。 对串的处理可以是对整个串本身,也可以是对串的一部分(即子串)进行加工处理。串的基本运算有:串的连接、求子串、求串的长度、求子串在串中的序号和串的置换等。

5.2 多维数组 5.2.1 二维数组的定义及操作 数组:数组(array)是由下标(index)和值(value)组成的序对的集合。 数组元素:在数组中,对每组有定义的下标,都存在一个与其对应的值,称为数组元素。数组中的数据元素均属于同一数据类型。 例如,二维数组: Amn= a11 a12 … a1n a21 a22 … a2n … … … … am1 am2 … amn

元素与位置的对应关系:在二维数组中,每个元素都受行关系和列关系的约束。如A[m][n],对第i行第j列元素A[i][j],A[i][j+1]是行关系中的直接后继元素,而a[i+1][j]是该元素在列关系中的直接后继元素。 二维数组可以看成是一个一维数组,它有row个数据元素,每个数据元素又是一个有col个数据元素的一维数组。 数组的运算: 给定下标,存取相应的数据元素 给定一组下标,修改相应数据元素的值 数组一旦被定义,其维数和维界就不再改变,即数据元素的个数和元素之间的关系就不再发生变动。数组一般不做插入或删除操作。

5.2.2 二维数组的向量存储结构 一、二维数组的顺序存储规则通常有两种: 5.2.2 二维数组的向量存储结构 一、二维数组的顺序存储规则通常有两种: 1、行优先顺序——将数组元素按行排列,第i+1个行向量紧接在第i个行向量后面。 A的m*n个元素按行优先顺序存储的线性序列为: a11,a12,…,a1n,a21,a22,…a2n,……,am1,am2,…,amn 在PASCAL、C语言中,数组就是按行优先顺序存储的。 2、列优先顺序——将数组元素按列向量排列,第j+1个列向量紧接在第j个列向量之后。按列优先顺序存储的线性序列为: a11,a21,…,am1,a12,a22,…am2,……,an1,an2,…,anm 在FORTRAN语言中,数组就是按列优先顺序存储的。

二、数组元素存储地址、序号的运算: 设二维数组A(m×n)按行优先顺序存储,数组中第一个元素的序号为1,每个数据元素占用的存储单元数b。 求数组元素在向量中的序号: index(ai,j)=n(i-1)+j 求某个数据元素(下标i,j)的存储起地址: loc(ai,j)=loc(a1,1)+[n(i-1)+(j-1)]b 计算数组中每个元素的存储起地址所花的时间是一样的,即存取数组中任以元素耗时相同,因此,称数组的这种顺序存储结构是随机存储结构。

5.2.3 稀疏矩阵的压缩存储 引言 矩阵是很多科学与工程计算问题中研究的数学对象。如何存储矩阵的元,从而使矩阵的各种运算能有效进行是我们需要研究的问题。 在此,我们将对稀疏矩阵的压缩存储和转置两个问题进行讨论。本小结介绍稀疏矩阵的定义及压缩存储。

稀疏矩阵的定义:当矩阵中非常元素个数远小于元素总数时,称为稀疏矩阵。 压缩存储:为多个值相同的原只分配一个存储空间;对零元不分配存储空间。 稀疏矩阵压缩存储的实现:每个非零元素用一个三元组(i,j,v)表示,其中,i,j为非零元素的行号与列号,v为元素值。把三元组按行优先顺序存储为一个线性结构,称三元组表。三元组表是稀疏矩阵的一种顺序存储结构,其数据类型描述如下。

稀疏矩阵的三元组表数据类型: #define MAXLEN 40 #define DATATYPE1 int typedef struct {int i,j ; DATATYPE v; }NODE ; {int m, n, t NODE data [MAXLEN] }SPMATRZX ;

例1:写出下图所示稀疏矩阵的压缩存储形式。 1 2 3 4 5 6 1 1 2 3 4 5 6 1 2 3 4 5 6 0 12 9 0 0 0 0 0 0 0 0 0 -3 0 0 0 14 0 0 0 24 0 0 0 0 18 0 0 0 0 15 0 0 -7 0 0 解:用三元组线性表表示: {{1,2,12},{1,3,9},{3,1,-3},{3,5,14}, {4,3,24},{5,2,18},{6,1,15},{6,4,-7}} 说明:稀疏矩阵的压缩存储结构主要有三元组顺序表和三元组链表两大类型。

例2:下面的三元组表表示一个稀疏矩阵,试还原出它的稀疏矩阵。 i j d 1 2 3 4 md 5 nd 6 td 1 2 3 4 5 6 16 0 2 0 0 1 0 0 0 3 0 0 0 0 0 0 4 0 0 6 0 16 0 0 0 6 4

5.2.4 稀疏矩阵的转置算法 概念:矩阵的转置是指按一定规律变换元素的位置,一个m行n列的矩阵转置以后变成一个n行m列的矩阵。如将M(m*n)的矩阵转换为N(n*m)的矩阵,M的第(i,j)元素转置后变为N的第(j,i)元素。 转置算法:稀疏矩阵的两种转置算法:一般插入算法,transpose算法。下面分别予以介绍。

1、一般插入算法 其基本思想是:对a.data扫描一遍,扫描过程中依次取出a.data中的每一个三元组元素,将它们的行号和列号互换后依次放入b.data中,即可得到转置B的压缩存储表示。 2、 transpose算法 其基本思路是:考虑到b.data中的行就是a.data中的列,要想得到b.data中行号为1的三元组元素,可对a.data扫描一遍,找出a.data中列号为1的元素即可。算法如下。

transpose算法 void transpose(SPMATRIX b, SPMATRIX a) { int p,q,col; b.m=a.n; b.n=a.m; b.t=a.t; if(a.t!=0) {q=1; for(col=1;col<=a.u; col++) for(p=1;p<=a.t;p++) if(a.data[p].j= =col) {b.data[q].j=a.data[p].i; b.data[q].i=a.data[p].j; b.data[q].v=a.data[p].v; q++; }} }

5.3 应用举例及分析 SEQSTRING substr(SEQSTRING s, int i, int j) 5.3 应用举例及分析 例5.1在串的顺序定长存储结构上实现求子串函数SUBSTR(S,i,j)。此操作不会发生字串截断的情况,算法中,对给定的参数作合法性判断,当参数非法时,函数返回空串。 SEQSTRING substr(SEQSTRING s, int i, int j) //返回s串中的第i个字符起长度为j的子串 {SEQSTRING sub; int n; if(i<1|| i>s.len || j<0 || j>s.len – i +1) sub.len = 0; else {for(n = 1 ; n<= j ; n++) sub.ch[n] = s.ch[i+ n - 1]; sub.len = j;} return sub; }

例5.2 在串的堆分配存储结构上实现求子串函数SUBSTR(S,i, j) 前面讨论了在串的顺序定长存储结构上实现SUBSTR(S,i,j)函数的算法。下面是在串的堆分配存储结构上实现SUBSTR(S, i, j)函数的算法。此算法中,对给定的参数须作合法性判断,当参数非法时,函数返回空串。读者可和上面的算法作比较,进一步掌握串的两种存储结构。

HSTRING substr_h(HSTRING s, int i, int j) //返回s串中的第i个字符起长度为j的子串 { HSTRING sub; int n; if(i< 1 || i > s.len || j < 0 || j > s.len –i + 1) { sub.ch = NULL; sub.len = 0;} else { sub.ch = malloc(j * sizeof(char)); for(n = 1; n <= j; n++) sub.ch[n] = s.ch[n + i -1]; sub.len = j;} return sub; }

例5.3已知一个二维数组A,行下标0≤i≤7,列下标0≤j≤9,每个元素的长度为3字节,从首地址200开始连续存放在内存中,该数组元素按行优先存放,问:元素A7,4的起地址是多少? 该二维数级是用顺序存储结构存放元素,可用前面介绍的计算公试进行计算。A数组的行号数是8,列号数是10。题中给出的存放形式和C语言中一致,数组下标的下界是0,因此地址的计算公式是:LOC(ai,j) = LOC(a0,0)+(i n + j)b,套用此公式,求得结果:200+(7×10+4)×3=422

例5.4设矩阵A(6 * 6),A中元素满足下列条件 aij ≠ 0 (i≥j,1≤i,j≤6) aij = 0 (i < j,1≤i,j≤6) 现将所有非0元素以行优先顺序存放在首地址为2000的内存中,每个元素占4个单元,计算元素A5,2的首地址。 首先看到矩阵A是一个行号和列号相等的矩阵。我们又称这种的矩阵为n阶方阵。A为6阶方阵(n = 6)。从元素满足的条件看,矩阵A中的下三角部分(包括对角线)存放了非0元素,而上三角部分(不包括对角线)全为0,如图5.8图所示。

1 11 12 3 5 31 4 6 2 7 8 82 -5 A(6*6) = (a)6阶方阵A的上半角部分全为零

基于这样的特殊性,可压缩存放矩阵元素,压缩的基本思想是:非0元素按行优先顺序存放,只分配一个单元存放0元素。所以只要存储矩阵中包括对角线在内的下三角中的元素,加上一个存放0的单元。包括对角线在内的下三角部分共有n(n+1)/2+1个存储单元。存放结构如图5.8(b)所示。 2000 A5,2元素的起始地址 = 2044 1 11 2 3 4 50 5 6 7 8 12 2 31 -5 8 31 7 82 5 4 3 … n(n+1) 2 + 1 n(n+1) 2 (b)A的压缩存储

这些元素存放在一个向量中,设定下标从1开始,每个元素占b个单元,方阵A中每一个元素ai,j(1≤i,j≤6)的首地址的计算公式如下: LOC(ai,j)= LOC(a1,1) + (i(i-1)/2+(j-1))b (i≥j) LOC(ai,j) = LOC(a1,1) + (n(n+1)/2)b (i<j) 推导原则是:对第I个行中的元素而言,前面i-1行中包含一个(i-1)阶方阵,其下三角中的元素个数是(i-1)i/2个。用上面的公式可计算得A5,2元素的首地址是: 2000+(5(5-1)/2+(2-1))×4=2044

习题 P65 5.3, 5.4, 5.6

1、定长顺序串:用一组连续的存储单元来存放串,直接使用定长的字符数组来定义,数组的上界预先给出,故称为静态存储分配。 顺序串的数据类型可描述为: Type struct {char ch[MAXSIZE]; int len; }SEQSIRING; 返 回

2、堆分配串:仍用一组连续的存储单元来存放串,但存储空间是在程序执行过程中动态分配而得。内存区域的空间块称堆。 顺序串的数据类型可描述为: typedef struct {char *ch; int len; }HSTRING 返 回