数组和广义表
数组与广义表
其中:1) 矩阵Am×n看成n个列向量的线性表
2) 每个列向量:αj=(a1j, a2j, a3j, …, amj )(0≤j ≤n-1) 3) ai,j在列方向上有一个前驱ai-1,j, 有一个后继ai+1,j
• 或者,可以看成是一个线性表:A=(a0,a1,……,am-1)
• 其中每个数据元素aj是一个行向量形式的线性表: A
}ADT Array
• • • N维数组含有元素的个数: b1 × b2 × … × bn 第i维的长度: bi 元素下标(j1 , j2, … ,jn),0 ≤ ji ≤ bi -1
5.1 数组示例:
数组的定义
a00 a01 …….. a10 a11 …….. am-1,n-1 …….. a0,n-1 a1,n-1 am-1,n-1
1 2 … i-1 aij
*(A.base + off) = e;
return OK; }
5.3 矩阵的压缩存储 特殊矩阵和稀疏矩阵
特殊矩阵:矩阵中很多值相同的元素并且它们的分布 有一定的规律。 稀疏矩阵:矩阵中有很多零元素。 压缩存储的基本思想是: ⑴ 为多个值相同的元素只分配一个存储空间;
⑵ 对零元素不分配存储空间。
5.3.1 3 6 4 7 8
普通高等教育“十一五”国家级规划教材
设一个系统中二维数组采用行序为主的存储方式,已知二 维数组a[10][8]中每个元素占用四个存储单元,且第一 个数据元素地址是1000,求a[4][5]的存储地址?
解: Loc(a[4][5])=Loc(a[0][0])+(i*m+j)*k =1000+(4*8+5)*4 =1148
L:每个数据元素占用的存储单元
《数据结构——用C语言描述(第二版)》第5章 数组和广义表
第五章 数组和广义表
在压缩存储时,矩阵中值相同的元素C可共享一个存储空间,元素 为零则可不必分配空间,而其余的元素有 n(n+1)/2个,因此三角矩阵 可用一维数组M[n×(n+1)/2+1]来存储,其中常数C放在数组的最后一 个下标变量中。
假设A和B矩阵分别用matrix型指针变量a和b表示,矩阵的转置可以 按以下进行:由于B的行是A的列,所以可按照b->data三元组表的次序在 a->data中找到相应的三元组进行转置,即可按a->data的列序转置,所得 到的转置矩阵B的三元组表b->data必定是按行优先存放的。因此,可以对 三元组表a->data从第一行起扫描,找到A的每一列中所有的非零元素,就 可以实现转置。
LOC ( aij ) =LOC ( a00) +(i×n+j) × c 同理可推导出以列为主序优先存储时数据元素a i j 的存储地址,其计算公式 为:
LOC( a i j ) =LOC( a00 ) +( j × n +i ) × c 对于三维数组Am×n×p而言,若以行为主序优先存储时,则其数据元 素aijk的存储地址可为: LOC ( a i j k) =LOC ( a000) +[ i × m×p +j ×p +k] × c 对于一般的二维数组A[c1…d1,c2…d2]而言,此处c1,c2的值不一定是 0,a i j 的地址为: LOC ( a i j ) =LOC ( a c 1 c 2 ) +[ ( i – c 1 )* ( d 2 – c 2 +1) +j – c 2 ] * c
第8章 数组和广义表
第8章数组和广义表[能力要求](1)计算机基础知识:掌握线性表的概念以及顺序表和链表的基本操作。
(2)分析问题:针对具体的问题,要能够运用线性表去进行分析,逐步找到解决问题的方法。
(3)具有概念化和抽象化能力:针对具体的应用和实际的问题,能够运用线性表对问题进行抽象,提取它的逻辑结构和存储结构。
(4)发现问题和表述问题:在具体的工程中,能够发现工程中涉及到顺序表和链表的问题,并能够明确表述。
(5)建模:在具体的工程中,能够使用线性表进行建模,设计合理的数据结构和相应的算法。
(6)解决方法和建议:在具体工程应用中,发现了关于线性表的问题,要能够解决问题,并提出合理的建议。
(7)定义功能、概念和结构:使用线性表这种逻辑结构处理一些具体问题,实现系统的功能。
(8)设计过程的分段与方法:采取不同的阶段去设计(概念设计、详细设计)一个具体的线性表的应用项目。
(9)软件实现过程:了解系统中各个模块中的关于线性表的设计;讨论算法(数据结构、控制流程、数据流程);使用编程语言实施底层设计(编程)。
8.1知识点:数组的定义和顺序存储一、选择题1①常对数组进行的两种基本操作是()。
A.建立与删除 B.索引和修改C.对数据元素的存取和修改D.查找与索引2①下面说法中,不正确的是()。
A.数组是一种线性结构B.数组是一种定长的线性表结构C.除了插入与删除操作外,数组的基本操作还有存取、修改、检索和排序等D.数组的基本操作有存取、修改、检索和排序等,没有插入与删除操作3②数组A中,每个元素的长度为3个字节,行下标I从1到8,列下标J从1到10,从首地址SA开始连续存放在存储器内,该数组占用的字节数为()。
A.80 B.100 C.240 D.2704②在二维数组A[9][10]中,每一个数组元素A[i][j] 占用3个存储空间,所有数组元素相继存放于一个连续的存储空间中,则存放该数组至少需要的存储空间是()。
A. 80 B.100 C.240 D.2705②设有一个n*n的对称矩阵A,将其下三角部分按行存放在一个一维数组B中,A[0][0]存放于B[0]中,那么第I行的对角元素A[I][I]存放于B中()处。
数据结构第5章
第5章:数组和广义表 1. 了解数组的定义;填空题:1、假设有二维数组A 6×8,每个元素用相邻的6个字节存储,存储器按字节编址。
已知A 的起始存储位置(基地址)为1000,则数组A 的体积(存储量)为 288 B ;末尾元素A 57的第一个字节地址为 1282 。
2、三元素组表中的每个结点对应于稀疏矩阵的一个非零元素,它包含有三个数据项,分别表示该元素的 行下标 、 列下标 和 元素值 。
2. 理解数组的顺序表示方法会计算数组元素顺序存储的地址;填空题:1、已知A 的起始存储位置(基地址)为1000,若按行存储时,元素A 14的第一个字节地址为 (8+4)×6+1000=1072 ;若按列存储时,元素A 47的第一个字节地址为 (6×7+4)×6+1000)=1276 。
(注:数组是从0行0列还是从1行1列计算起呢?由末单元为A 57可知,是从0行0列开始!) 2、设数组a[1…60, 1…70]的基地址为2048,每个元素占2个存储单元,若以列序为主序顺序存储,则元素a[32,58]的存储地址为 8950 。
答:不考虑0行0列,利用列优先公式: LOC(a ij )=LOC(a c 1,c 2)+[(j-c 2)*(d 1-c 1+1)+i-c 1)]*L 得:LOC(a 32,58)=2048+[(58-1)*(60-1+1)+32-1]]*2=8950选择题:( A )1、假设有60行70列的二维数组a[1…60, 1…70]以列序为主序顺序存储,其基地址为10000,每个元素占2个存储单元,那么第32行第58列的元素a[32,58]的存储地址为 。
(无第0行第0列元素)A .16902B .16904C .14454D .答案A, B, C 均不对 答:此题(57列×60行+31行)×2字节+10000=16902( B )2、设矩阵A 是一个对称矩阵,为了节省存储,将其下三角部分(如下图所示)按行序存放在一维数组B[ 1, n(n-1)/2 ]中,对下三角部分中任一元素a i,j (i ≤j), 在一维数组B 中下标k 的值是:A .i(i-1)/2+j-1B .i(i-1)/2+jC .i(i+1)/2+j-1D .i(i+1)/2+j3、从供选择的答案中,选出应填入下面叙述 ? 内的最确切的解答,把相应编号写在答卷的对应栏内。
数据结构数组与广义表知识点总结
数据结构数组与广义表知识点总结数组是一种线性数据结构,可以存储多个相同类型的元素。
它的特点是元素的大小固定,并且在内存中是连续存储的。
数组的访问方式是通过下标来访问,下标从0开始。
数组可以在编程中应用于各种情况,比如存储一组数字、一组字符串等。
广义表是一种扩展的线性数据结构,可以存储不同类型的元素。
它由元素和表构成,其中表可以是空表、原子或子表。
广义表可以递归定义,即子表可以包含更多的子表。
广义表的访问方式是通过递归来访问,可以对表的元素进行遍历和操作。
在数据结构中,数组和广义表都有自己的特点和用途,下面对它们的知识点进行总结:1.数组的特点及应用:-数组是一种线性数据结构,可以存储多个相同类型的元素。
-数组的内存分配是连续的,可以通过下标来访问元素。
-数组的大小固定,一旦定义后不能改变。
-数组的访问速度快,可以通过下标直接访问元素。
-数组适合用于存储一组相同类型的数据,比如一组数字、一组字符串等。
-数组的应用场景包括但不限于:排序算法、查找算法、图像处理、矩阵运算等。
2.数组的操作和常用算法:-初始化:可以直接赋值或使用循环初始化数组。
-访问元素:通过下标访问元素,下标从0开始。
-修改元素:直接通过下标修改元素的值。
-插入元素:需要移动插入位置之后的元素。
-删除元素:需要移动删除位置之后的元素。
-查找元素:可以使用线性查找或二分查找等算法。
-排序算法:比如冒泡排序、选择排序、插入排序等。
-数组还有一些常用的属性和方法,比如长度、最大值、最小值等。
3.广义表的特点及应用:-广义表是一种扩展的线性数据结构,可以存储不同类型的元素。
-广义表由元素和表构成,表可以是空表、原子或子表。
-广义表可以递归定义,即子表可以包含更多的子表。
-广义表的访问方式是通过递归遍历和操作。
-广义表适合存储一组不同类型的数据,比如存储学生信息、函数调用栈等。
-广义表的应用场景包括但不限于:函数式编程、树的表示、图的表示等。
数组和广义表 数据结构
3.建立广义表的存储结构 假定广义表中的元素类型ElemType为chai类型,每个原子的值被限 定为英文字母。并假定广义表是一个表达式,其格式为:元素之间用一 个逗号分隔,表元素的起止符号分别为左、右圆括号,空表在其圆括号 内不包含任何字符。例如“(a,(b, c, d))”就是一个符合上述规定的广 义表格式。 建立广义表存储结构的算法同样是一个递归算法。该算法使用一个 具有广义表格式的字符串参数s,返回由它生成的广义表存储结构的头结 点指针h。在算法的执行过程中,需要从头到尾扫描s的每一个字符。当 碰到左括号时,表明它是一个表元素的开始,则应建立一个由h指向的表 结点,并用它的sublist域作为子表的表头指针进行递归调用,来建立子 表的存储结构;当碰到一个英文字母时,表明它是一个原子,则应建立 一个由h指向的原子结点;当碰到一个“)”字符时,表明它是一个空表, 则应置h为空。当建立了一个由h指向的结点后,接着碰到逗号字符时, 表明存在后继结点,需要建立当前结点(即由h指向的结点)的后继表; 当碰到右括号或分号字符时,表明当前所处理的表已结束,应该置当前 结点的link域为空。 4.输出广义表 5.广义表的复制
广义表的转换过程
为了使子表和原子两类结点既能在形式上保持一致,又能进
行区别,可采用如下结构形式:
其中,tag域为标志字段,用于区分两类结点。sublist或data
域由tag决定。若tag=0,表示该结点为原子结点,则第二个 域为data,存放相应原子元素的信息;若tag=l,表示该结点 为表结点,则第二个域为sublist,存放相应子表第一个元素 对应结点的地址。link域存放与本元素同一层的下一个元素所 在结点的地址,当本元素是所在层的最后一个元素时,link域 为NULL。 例:前面的广义表C的存储结构如下图所示(很多《数据结构 公教科书上称之为带表头结点的广义表的链表存储结构
数据结构课件PPT数组和广义表
{ q=1; for (col=1;col<=T.mu;++col) for(p=1;p<=M.tu;++p) if ( M.data[p].j==col ) { T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++q; } }
(row) (col) (value)
[0] 1 4 22
[0] 1 5 91
[1] 1 7 15
[1] 2 2 11
[2] 2 2 11
[2] 3 6 28
[3] 2 [4] 3来自6 17 4 -6[3] 4 [4] 4
1 22 3 -6
[5] 4 6 39
[5] 6 2 17
[6] 5 1 91
[6] 6 4 39
cpot[1]=1 cpot[col]=cpot[col-1]+num[col-1]
稀疏矩阵的快速转置(算法5.2)
Status FastTransposeSMatrix(TSMatrix M,TSMatrix &T) { T.mu=M.nu; T.nu=M.mu; T.tu=M.tu;
if (T.tu) { for (col=1;col<=M.nu;++col) num[col]=0; for (t=1;t<=M.tu;++t) ++num[M.data[t].j]; cpot[1]=1; for ( col=2;col<=M.nu;++col) cpot[col]=cpot[col-1]+num[col-1]; for (p=1;p<=M.Tu;++p) { col=M.data[p].j; q=cpot[col]; T.data[q].i=M.data[p].j; T.data[q].j=M.data[p].i; T.data[q].e=M.data[p].e; ++cpot[col]; } }
第5章 数组和广义表总结
0603
2090
B5×4 = 0 8 0 0
0000
row col val
4000
0 12
0 44
1 06
1 28
2 19
3 03
现在,要通过A的 三元组表求其转置 矩阵B的三元组表。
row col val
0 16 0 33 1 02 1 29 2 18 4 04
16
三元组表的转置
方法1:设矩阵A是m行、n列、t个非0元素 从头到尾扫描A,将第0列的元素依次放入B(行号列号互换); 从头到尾扫描A,将第1列的元素依次放入B(行号列号互换); ...... 从头到尾扫描A,将第n-1列的元素依次放入B(行号列号互换); 扫描A几趟? 矩阵A的列数n
}tritype;
typedef struct { //三元组表
tritype data[MAXSIZE]; //三元组表存储空间
int mu, nu, tu;
//原矩阵的行数、列数、非0元素个数
}Tsmtype, *Tsmlink;
//三元组表说明符
14
三元组表
例 5.3 矩阵的转置。 求矩阵A的转置矩阵B,算法很简单:
ArrayInit(&A, n, d1, d2, ..., dn) ArrayDestroy(&A)
ArrayGet(A, i1, ..., in, &e)
ArrayAssign(&A, i1, ..., in, e) }ADT Array;
数组的基本操作一般不包括插入和删除
4
5.2 数组的存储结构
存储空间是在程序执行时动态分配的
n维数组A[u1][u2]…[un]
数据结构第五章 数组和广义表
5.3.1
特殊矩阵
1、对称矩阵 在一个n阶方阵A中,若元素满足下述性质: aij = aji 1≤i,j≤n 则称A为对称矩阵。 a11 1 5 1 3 7 a21 a 22 5 0 8 0 0 a31 a32 a33 1 8 9 2 6 ……………….. 3 0 2 5 1 an 1 a n 2 a n 3 …a n n 7 0 6 1 3
第5章
数组和广义表
5.1 数组的定义
5.2 数组的顺序表示和实现
5.3 矩阵的压缩存储
5.3.1 特殊矩阵
5.3.2 稀疏矩阵
5.4 广义表的定义
5.1 数组的定义
数组-----线性表的扩展 A =(a0,a1,a2,…,an-1)
a00 a10 ┇ Am×n= ai0 ┇ am-1,0 a01 … a0j … a11 … a1j … ┇ ai2 … aij … ┇ am-1,2 … am-1,j … a0,n-1 a1,n-1 ai,n-1 am-1,n-1 α0 α1 ┇ Am×n= α i ┇ α m-1
Assign( &A, e, index1, ..., indexn) 赋值操作 初始条件:A是n维数组,e为元素变量,随后是n个下标值。 操作结果:若下标不超界,则将e的值赋给所指定的A的元 素,并返回OK。 对于数组来说一旦维数确定了,每个元素的下标确定了, 那么整个数组就确定了,这样的一个数组结构除了能改变 某元素的值,其他的不能再改变。
5.2 数组的顺序表示和实现
数组类型特点: 1) 只有引用型操作,没有加工型操作; 2) 数组是多维的结构,而存储空间是一个一维的结构。 有两种顺序映象的方式。
有两种顺序映像方法: 1)以行序为主序(行优先,先行后列):先存储行号较小 的元素,行号相同者先存储列号较小的元素;
数组与广义表
数组与⼴义表5.1数组是由具有某种结构的数据元素构成,⼴义表则是由单个元素或⼦表构成的。
因此数组和⼴义表中的数据元素可以是单个元素,也可以是⼀个具有线性结构的数据。
从这个意义上讲,数组和⼴义表是线性表的推⼴。
“N维数组是数据元素为N-1维数组的线性表”5.2.数组的顺序存储与实现:(1)按⾏序存储(2)按列序存储5.3特殊矩阵的压缩存储特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有⼀定规律性的矩阵。
常见的特殊矩阵:对称矩阵、上(下)三⾓矩阵、对⾓矩阵三对⾓矩阵:第⼀⾏和最后⼀⾏只有两个元素,其它都是三个元素;第⼀列和最后⼀列都是两个元素,其它列都是三个元素。
特殊矩阵的压缩原则:(1)元素分布有特殊规律的矩阵,寻找规律对应的公式,实现压缩存储。
(2)⾮零元素很少的稀疏矩阵,可采⽤只存储⾮零元素的⽅法实现压缩存储。
稀疏矩阵:是指矩阵中⼤多数元素为零的矩阵压缩存储策略:(1)由于稀疏矩阵中⾮零元素的分布通常没有规律,因此,在存储⾮零元素值的同时,还必须存储该⾮零元素在矩阵中所处的⾏号和列号,相应的⾏和列与⾮零元素构成⼀个三元组(⾏标,列标,值),这就是稀疏矩阵的三元组表⽰法,稀疏矩阵压缩存储后便失去了随机存取性。
优点:节约了空间,使得矩阵中某些运算的时间效率优于经典算法。
(2)为了避免⼤量移动元素,稀疏矩阵也可采⽤链式存储法---⼗字链表,它能够灵活地插⼊因运算⽽产⽣的新的⾮零元素,删除因运算⽽产⽣的新的零元素,实现矩阵的各种运算。
5.4:⼴义表的数据元素可以是单个元素,也可以是⼴义表。
⼴义表的定义是递归定义的(1)⼴义表的元素可以是⼦表,⽽⼦表还可以是⼦表,因此,⼴义表就是⼀个多层的结构。
如A=(a,(b,c))(2)⼴义表可以被其他⼴义表共享,如:B=(A,A,D)通过该⼦表的名称就可以引⽤该表(3)⼴义表具有递归性,如C=(a,C);。
数据结构 第五章 数组和广义表
则行优先存储时的地址公式为: LOC(aij)=LOC(ac1,c2)+[(i-c1)*(d2-c2+1)+j-c2)]*L
数组基址
aij之前的行
数
总列数,即 第2维长度
aij本行前面
的元素个数
单个元素 长度
例2一个二维数组A,行下标的范围是1到6,列下标的范围是0
到7,每个数组元素用相邻的6个字节存储,存储器按字节编址。 288 个字节。 那么,这个数组的体积是
2.若对n阶对称矩阵A以行序为主序方式将其下三 角形的元素(包括主对角线上所有元素)依次存 放于一维数组B[1..(n(n+1))/2]中,则在B 中确定aij(i<j)的位置k的关系为( )。 A. i*(i-1)/2+j B. j*(j-1)/2+i C. i*(i+1)/2+j D. j*(j+1)/2+i
维界虽未变,但此时的a[32,58]不 再是原来的a[32,58]
例5:假设有三维数组A7×9×8,每个元素用相邻的6个字节存
储,存储器按字节编址。已知A的起始存储位置(基地址)为 1000,末尾元素A[6][8][7]的第一个字节地址为多少?若按 高地址优先存储时,元素A[4][7][6]的第一个字节地址为多 少? 答: 末尾元素A[6][8][7]的第1个字节地址= 1000 +(9*8*6+8*8+7)*6=4018 提示:将第1维看作“页码”,后面两维就是每页上的二维数组 。 计算地址 的意义: 只要计算出任一数组元素的地址,就 能对其轻松地进行读写操作!
4.已知数组A[0..9,0..9]的每个元素占5个存储 单元,将其按行优先次序存储在起始地址为 1000的连续的内存单元中,则元素A[6,8]的 地址为_________
数据结构讲义第5章-数组和广义表
5.4 广义表
5)若广义表不空,则可分成表头和表尾,反之,一对表头和表尾 可唯一确定广义表 对非空广义表:称第一个元素为L的表头,其余元素组成的表称 为LS的表尾; B = (a,(b,c,d)) 表头:a 表尾 ((b,c,d)) 即 HEAD(B)=a, C = (e) D = (A,B,C,f ) 表头:e 表尾 ( ) TAIL(B)=((b,c,d)),
5.4 广义表
4)下面是一些广义表的例子; A = ( ) 空表,表长为0; B = (a,(b,c,d)) B的表长为2,两个元素分别为 a 和子表(b,c,d); C = (e) C中只有一个元素e,表长为1; D = (A,B,C,f ) D 的表长为4,它的前三个元素 A B C 广义表, 4 A,B,C , 第四个是单元素; E=( a ,E ) 递归表.
以二维数组为例:二维数组中的每个元素都受两个线性关 系的约束即行关系和列关系,在每个关系中,每个元素aij 都有且仅有一个直接前趋,都有且仅有一个直接后继. 在行关系中 aij直接前趋是 aij直接后继是 在列关系中 aij直接前趋是 aij直接后继是
a00 a01 a10 a11
a0 n-1 a1 n-1
a11 a21 ┇ a12 a22 ┇ ai2 ┇ … amj … amn … aij … ain … … a1j a2j … … a1n a2n β1 β2 ┇ βi ┇ βm
Chap5 数组与广义表
15 0 0 -7 0 0 0
随机稀疏矩阵的压缩存储方法:
一、三元组顺序表 二、 十字链表
一、三元组顺序表
对于非零元素在矩阵中随机出现的稀疏矩 阵,则在存储非零元素的同时,还必须存储该 非零元素在矩阵中所处的行号和列号。我们将 这种存储方法叫做稀疏矩阵的三元组表示法。
每个非零元素在一维数组中的表示形式 如图所示:
0 12 9 0 0 0 0 0 0 0 0 0 0 0 -3 0 0 0 0 14 0
M6 × 7 =
0 0 24 0 0 0 0
N7×6=
0 18 0 0 0 0 0
15 0 0 -7 0 0 0
0 12 9 0 0 0 0
0 0 0 0 0 0 0
-3 0 0 0 0 18 0 24 0 0 0 0 0 0 0 14 0 0 0 0 0
5.2 数组的顺序表示和实现
类型特点: 1)对于数组A,一旦给定其维数n及各维长度bi (1≤i≤n),则该数组中元素的个数是固定的, 不能对数组做插入和删除操作,不涉及移动元素 操作,因此数组采用顺序存储比较合适; 2) 数组是多维的结构,而存储空间是 一个一维 的结构, 因此有存储次序的约定问题。
L
二维数组Am*n中任一元素ai,j 的存储位置
LOC(i,j)=LOC(1,1) + (m×(j-1)+(i-1))×L
称为基地址或基址。
例:设有二维数组A[10][20],其每个元 素占2个字节,第一个元素A1,1的存储地址 为100,则按行优先顺序存储时元素A6,6的 存储地址为 A 6,6=100+[(6-1)*20+(6-1)]*2=310
┇
ai2 ┇
┇
i ┇ m
第五讲数组和广义表-
解决问题的原则:
1) 尽可能少存或不存零值元素;
2) 尽可能减少没有实际意义的运算;
3) 操作方便。 即: 能尽可能快地找到与
下标值(i,j)对应的元素, 能尽可能快地找到同
一行或同一列的非零值元。
有两类稀疏矩阵:
1) 特殊矩阵 非零元在矩阵中的分布有一定规则
例如: 三角矩阵 对角矩阵
2) 随机稀疏矩阵 非零元在矩阵中随机出现
图5.2 三角矩阵
三角矩阵中的重复元素c可共享一个存储空间, 其余的元素正好有n(n+1)/2个,因此,三角矩 阵可压缩存储到向量sa[0..n(n+1)/2]中,其中c 存放在向量的最后一个分量中,
上三角矩阵中,主对角线之上的第p行(0≦p<n) 恰有n-p个元素,按行优先顺序存放上三角矩阵 中的元素aij时,aij之前的i行一共有
(n-p)=i(2n-i+1)/2
个元素,在第i行上,aij前恰好有j-i个元素: aij,aij+1,…aij-1。因此,sa[k]和aij的对应关系是:
i(2n-i+1)/2+j-i 当i≦j
kn=(n+1)/2
当i>j
下三角矩阵的存储和对称矩阵类似,sa[k]和aij对应 关系是:
i(i+1)/2+j i≧j k=n(n+1)/2 i>j
R={R1, R2, ..., Rn} Ri={<a , a > | j1,... ji,... jn j1, ...ji +1, ...jn 0 jk bk -1, 1 k n 且k i, 0 ji bi -2, i=2,...,n } 基本操作:
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
6.4 广义表
• 广义表是线性表的推广。 • 也有人称其为列表(Lists)。
大外软件学院
6.4.1 广义表的定义和基本运算
• 广义表的定义和性质
大外软件学院
• 线性表是由n个数据元素组成的有限序列。其中每个组 成元素被限定为单元素,有时这种限制需要拓宽。 • 例如,中国举办的某体育项目国际邀请赛,参赛队清 单可采用如下的表示形式: • (俄罗斯,巴西,(国家队,辽宁队,吉林队),古 巴,美国,(),日本) • 在这个拓宽了的线性表中,韩国队应排在美国队的后 面,但由于某种原因未参加,成为空表。 • 国家队、辽宁队、吉林队均作为东道主的参赛队参加, 构成一个小的线性表,成为原线性表的一个数据项。 • 这种拓宽了的线性表就是广义表。
6.3.2 稀疏矩阵的三元组表存储
大外软件学院
• 将三元组按行优先的顺序,同一行中列号从小到 大的规律排列成一个线性表,称为三元组表 • 采用顺序存储方法存储该表如图所示。
10 0 19 0 0 0 0 0 0 0 0 1 0 0 0 0 7 0 0 0 0 0 0 0 0 0 0 0 0 5 0 35 0 0 0 0
大外软件学院
• 多维数组是一种非线性数据结构。 • 每一个数组元素最多可以有n个直接前驱和n个直 接后继。 • 所有数组是一个具有固定格式和数量的数据有序 集,每一个数据元素有唯一的一组下标来标识, • 在数组上不能做插入、删除数据元素的操作。数 组一旦被定义,每一维的大小及上下界都不能改 变。 • 在数组中通常做下面两种操作:
• 在矩阵A中求出每一行的最小值元素,然后判断该元素是 否是它所在列中的最大值,是则打印出,接着处理下一行。 矩阵A用一个二维数组表示。
6.1.2 数组的物理结构
•
大外软件学院
void saddle(int A[][],int m,int n) /*m,n是矩阵A的行和列*/ { int i,j,min; 算法实现如下: for(i=0;i<m;i++) /*按行处理*/ { min=A[i][0]; for(j=1;j<n;j++) if(A[i][j]<min) /*找第i行最小值*/ min=A[i][j]; for(j=0;j<n;j++) /*检测该行中的每一个最小值是否是鞍点*/ if(A[i][j]==min) { k=j; p=0; while(p<m&&A[p][j]<=min) p++; if( p>=m) printf("%d,%d,%d\n",i,k,min); }}}
• 对于三维数组Am×n×p,即m×n×p数组,对于数组元 素aijk其物理地址为:
• Loc(aijk)= Loc(a000)+(i×n×p+j×p+k)×d
6.1.2 数组的物理结构
大外软件学院
• 【例6-1】若矩阵Am×n中存在某个元素aij满足:aij是 第i行中最小值且是第j列中的最大值,则称该元素 为矩阵A的一个鞍点。试编写一个算法,找出A中的 所有鞍点。 • 基本思想:
A55 c c 7 4 3 c c c 6 10 c c c c 9
5 ... a12 ... a1,n-1 an-1,1
0 a00
1
2
3 a0,n-1
4 a11
n(n+1)/2 ... an-1,n-1 c
a01 ...
第 1行
第 2行
第n行 常数项
6.2.3 对角矩阵
A55 2 7 5 9 1 6 4 2 6 4 2 1 4 3 4 6 10 3 10 9
大外软件学院
3 2
1
7
6 1 5 4 4
6
9 2 3 10 9
5阶对称方阵及它的压缩存储
6.2.1 对称矩阵
• 一般对称矩阵的压缩存储
0 a00
第 1行
大外软件学院
i 0 1 j 0 3 value 10 -1
A66
2
3 4 5
0
2 4 4
19
7 5 35
稀疏矩阵
三元组存储
6.3.2 稀疏矩阵的三元组表存储
• 稀疏矩阵顺序存储的结构定义:
大外软件学院
• 存储每个非零元素三元组中的行、列以及它的值。 • 为了运算方便,矩阵的非零元素的个数也同时存储。 #define SMAX 1024 /*一个足够大的数*/
• 显然,广义表的定义是递归的。
6.4.1 广义表的定义和基本运算
大外软件学院
• 为书写清楚起见,通常用大写字母表示广义表,用 小写字母表示单个数据元素,广义表用小括号括起 来,括号内的数据元素用逗号分隔开。例如:
• • • • • • A B C D E F =( ) /*空广义表*/ =(e) /*只有一个单元素组成*/ =(a,(b,c,d)) /*一个单元素和一个广义表*/ =(A,B,C) /*三个广义表组成*/ =(a,E) /*一个单元素和一个广义表组成*/ =(()) /*包含一个空广义表的广义表*/
typedef struct { int i,j; /*非零元素的行、列*/ datatype v; /*非零元素值*/ }SPNode; /*三元组类型*/ typedef struct { int mu,nu,tu; /*矩阵的行、列及非零元素的个数*/ SPNode data[SMAX]; /*三元组表*/ }SPMatrix; /*三元组表的存储类型*/ 注意:这样的存储方法确实节约了存储空间,但矩阵的运算 从算法上可能变的复杂些。
6.1.2 数组的物理结构
大外软件学院
• 例如一个3×3二维数组,逻辑结构与物理结构如 图所示:
a00 a10 a20 a01 a11 a21
逻辑结构
a02 a12 a22
a00 a01 a02 a10 a11 a12 a20 a21 a22
a00 a10 a20 a01 a11 a21 a02 a12 a22
大外软件学院
• 矩阵中所有非零元素都集中在以主对角线为中心的带状区 域中,即除了主对角线和它的上下方若干条对角线的元素 外,所有其他元素都为零(或同一个常数c),称为对角矩 阵或带状矩阵。 • 按以行为主序,顺序的存储其非零元素。 • 对角矩阵示例 1,0 0 0 0
0,1
a1,1 a 2,1 0 0
a1, 2 a 2, 2 0 0
0 0 a n 2, n 2 a n 1,n 2
0 0 a n 2, n 1 a n 1, n 1
6.3.1 稀疏矩阵的概念
大外软件学院
Amn
a 0 a 0, 0 a a , 1,0 1 am1 am1,0
a0,1 a0,n1 a1,1 a1,n1 am1,1 am1,n1
6.1.1 数组的逻辑结构
1 a10
2 a11
3 a20
4 a21
5
...
n(n+1)/2-1 ... an-1,n-1
a22 ... an-1,0 an-1,1
第 2行
第3行
第 n行
• 对于下三角中的元素aij,其特点是:i≥j,因此它在SA中的下标k 与i、j的关系为: • k=i×(i+1)/2+j (0≤k<n×(n+1)/2 ) • 若i<j,则aij是上三角中的元素,因为aij=aji,所以将上式中的 行列下标交换就是上三角中的元素在SA中的对应关系: • k=j×(j+1)/2+i (0≤k<n×(n+1)/2 )
5 ... ...
0 a00
第 1行
1 a10
2 a11
3 a20
4 a21
n(n+1)/2 an-1,n-1 c
a22 ... an-1,0 an-1,1
第 2行
第3行
第 n行
常数项
6.2.2 三角矩阵
大外软件学院
• 上三角矩阵:主对角线以下均为同一个常数。 • 以行为主序顺序存储上三角部分,最后存储对角 线下方的常量。 3 2 7 8 9 c 3 6 8 2 • 上三角矩阵示例:
• 设m×n矩阵中有t个非零元素,且t远小于m×n, 这样的矩阵称为稀疏矩阵。 • 如果按常规分配方法,顺序分配在计算机内,那 将是相当浪费内存的。 • 解决方法:仅仅存放非零元素。 • 为方便查找相应的元素,将非零元素所在的行、 列以及它的值构成一个三元组(i,j,v)。 • 按某种规律存储这些三元组,这种方法可以节约 存储空间。
6.2.2 三角矩阵
大外软件学院
• 下三角矩阵:主对角线以上均为同一个常数。 • 以行为主序顺序存储下三角部分,最后存储对角 线上方的常量。 3 c c c c 2 1 c c c • 下三角矩阵示例:
A55 7 6 5 c c 5 6 4 6 c 8 2 3 6 5
6.4.1 广义表的定义和基本运算
• 广义表的性质
大外软件学院
• 广义表是一种多层次的数据结构。广义表的元素可以是 单元素,也可以是子表,而子表的元素还可以是子 表,… 。 • 广义表可以是递归的表。广义表的定义并没有限制元 素的递归,即广义表也可以是其自身的子表。例如表 E就是一个递归的表。 • 广义表可以为其他表所共享。例如,表A、表B、表C 是表D的共享子表。在D中可以不必列出子表的值,而 用子表的名称来引用。 • 广义表可以看成是线性表的推广,线性表是广义表的 特例。 • 广义表的结构灵活,它可以兼容线性表、数组、树和 有向图等各种常用的数据结构。