第五章数组和广义表chapter5arraysandgeneralizedlists
数据结构第wu章

int *constants; //数组映像函数常量的基址
}Array;
即Ci信息保存区
数组的基本操作函数说明(有5个) (请阅读教材P93-95) 以销毁数组函数为例
9
数组的基本操作函数说明(5个) (见教材P93-95)
Status InitArray(Array &A,int dim,…){
基地址为2048,每个元素占2个存储单元,若以列序为主序
顺序存储,则元素a[32,58]的存储地址为 8950
。
答:请注意审题!利用列优先通式:
LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L 得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1)]*2=8950
一个元 素长度
第i维长度
与所存元素个数有关的系 数,可用递推法求出
8
N维数组的顺序存储表示(见教材P93)
#define MAX_ARRAY_DIM 8 //假设最大维数为8
typedef struct{
ELemType *base; //数组元素基址
int
dim;
//数组维数
int
*bound; //数组各维长度信息保存区基址
Ri = {<aj1,j2,…ji…jn , aj1,j2,…ji+1…jn >| aj1,j2,…ji…jn , aj1,j2,…ji+1…jn D }
基本操作:构造数组、销毁数组、读数组元素、写数组元素
数组的抽象数据类型定义略,参见教材P90 疑问:为何书中写成i=2,…n?
4
第五章 数组和广义表

矩阵Am×n看成n个列向量的线性表,即j=(a1j,a2j, …,amj)
还可以将数组Am×n看成另外一个线性表:
B=(1,,2,,… i ,…,m),其中i(1≤i≤m) 本身也是一个线性表,称为行向量,即: i= (ai1,ai2, …,aij ,…,ain)。 B ‖ 1 … i … m
5.3.1 特殊矩阵
• 三类特殊矩阵: 1. 对称矩阵:若 n 阶方阵A中的元满足特性 aij =aji 1≤i,j≤n 则称为 n 阶对称矩阵; 2. 2. 三角矩阵:若 n 阶方阵中下(上)三角(不包括对 角线)中的元均为常量 c 或 0,则称为上(下)三角矩 阵; 3. 3. 对角矩阵:若n阶方阵中的非零值元都集中在以主 对角线为中心的(由k条对角线组成的)带状区域中, 则称为k对角矩阵。
三维数组A中任一元素ai,j,k 的存储位置
a0,0,0 a0,0,1 a0,0,2 a0,1,0 a0,1,1 a0,1,2 a1,0,0 a1,0,1 a1,0,2 a1,1,0 a1,1,1 a1,1,2
Loc(ai,j,k)=Loc(a0,0,0)+(b2*b3* i+b3* j+k)* L
a11 a12 … a1,n a21 a22 … a2,n … an,1 an,2 … ann
k=0 1 …………………………… n(n-1)/2 n(n+1)/2-1
a11 a12 … a1,j … a1,n
An*n=
a21 a22 … a2,j … a2,n
ai-1,1 ai-2,2…ai-1,j …ai-1,n ai,1 ai,2 … ai,j … ai,n
5.3 矩阵的压缩存储
• 压缩存储:为多个值相同的元素只分配一个存 储空间,对零元素不分配空间。 • 目的:节省存储空间 • 任务:压缩存储矩阵并使矩阵的运算有效进行。 • 矩阵的存储:二维数组 • 可压缩存储的矩阵有两类: – 特殊矩阵:值相同的元素或零元素在矩阵中 分布有一定规律。如三角矩阵、对角矩阵。 – 随机稀疏矩阵:值相同的元素或零元素在矩 阵中分布没有一定规律。
数据结构(C语言版 李素若)第五章 数组和广义表PPT资料优秀版

OLink *hl; Head(B)=e Tail(B)=() 4.求广义表的深度
h广p义), s表ub的); 定q=义p;并没有限制元L素O的递C归(,)=即广L义O表也C可(以a是11其1自)+身d的2子d表3。(i1-1)+d3(i2-1)+(i3-1)
5.3 矩阵压缩存储 18
5.3.1 对称矩阵
对称矩阵的特点是:在一个n阶方阵中,有aij=aji,其中 1≤i,j≤n。对称矩阵关于主对角线对称,比如,我们只存储下三 角中的元素aij,其特点是中j≤i且1≤i≤n,对于上三角中的元素 aij,它和对应的aji相等,因此当访问的元素在上三角时,直接 去访问和它对应的下三角元素即可,这样,原来需要n*n个存 储单元,现在只需要n(n+1)/2个存储单元了,节约了n(n-1)/2个 存储单元,当n较大时,这是可观的一部分存储资源。
第5章 数组和广义表
1
5.1 数组类型定义 5.2 数组顺序存储和实现 5.3 矩阵压缩存储 5.4 稀疏矩阵 5.5 广义表
5.1 数组类型的定义 2
1.一维数组 一维数组可以看成是一个线性表或一个向量(第2章已经介 绍),它在计算机内是存放在一块连续的存储单元中,适合于 随机查找。这在第2章的线性表的顺序存储结构中已经介绍。 2.二维数组 二维数组中的每一个元素最多可有两个直接前驱和两个直接 后继(边界除外),故是一种典型的非线性结构。例如,设A 是一个有m行n列的二维数组,则A可以表示为:
LOC(bij)=LOC(b11)+(d2-c2+1)(i-1)+(j-1) 公式中第2项是i-1个整行元素,每行d2-c2+1个元素。也可以解 释为第1维下标减1乘上后面第2维下标区间。
Chapter05_数组和广义表_数据结构(C语言版)_严蔚敏_配套ppt课件

M
1 1 2 3 3 4
1 5 3 1 2 4
3 7 -1 -1 -2 2
N
1 1 2 3 4 5
1 3 3 2 4 1
3 -1 -2 -1 2 7
行列下 标调换
1 5 3 1 2 4
1 1 2 3 3 4
3 7 -1 -1 -2 2
按行下 标排序
法1:
按照矩阵M的列序进行转置,即按三元组A的 第二个字段值(列下标)由小到大的顺序进行转置。 为了找到M中每一列中所有的非零元素,需要对其 三元组表a.data从第一行起整个扫描一遍,由于 a.data是以M的行序为主序来存放每个非零元素 的,对于M中具有相同列下标的非零元来讲,先扫 描到的非零元的行下标一定小于后扫描到的非零元 的行下标,由此得到的恰是b.data应有的顺序。
• 压缩的含义
– 为多个值相同的元素只分配一个存贮空间; – 零元素不分配或少分配存贮空间。
• 特殊矩阵:元素值相同或零元素分布有 一定规律的矩阵。 • 稀疏矩阵:元素值相同或零元素分布没 有规律的矩阵。 • 特殊矩阵的压缩存贮实际是将二维数组 的数据元素压缩到一维数组上。
特殊矩阵的压缩存储
特殊矩阵: 非零元在矩阵中的分布有一定规则
常用的稀疏矩阵的存储方法
三元组表示法 顺序存储 行逻辑联接的顺序表 带辅助行向量的二元组表示法 伪地址表示法 带行指针向量的单链表示法 链接存储 散列存储 行列表示法(十字链表) 多链表示法(正交表)
顺序存储
1、三元组表示法 用一个线性表来表示稀疏矩阵,线性表的每个 结点对应稀疏矩阵的一个非零元素。其中包括三个 域,分别为该元素的行下标、列下标和值。结点间 的先后顺序按矩阵的行优先顺序排列(跳过零元 素),将线性表用顺序的方法存储在连续的存储区 里。
数据结构第五章

Loc(aij)=Loc(a11)+[(j-1)*m+(i-1)]*K (尽管是方阵,但公式仍不同)
例3:〖00年计算机系考研题〗设数组a[1…60, 1…70]的
基地址为2048,每个元素占2个存储单元,若以列序为主序 顺序存储,则元素a[32,58]的存储地址为 8950 。 答:请注意审题!利用列优先通式: LOC(aij)=LOC(ac1,c2)+[(j-c2)*(d1-c1+1)+i-c1)]*L 得:LOC(a32,58)=2048+[(58-1)*(60-1+1)+32-1)]*2=8950
9
一、稀疏矩阵的压缩存储
二、稀疏矩阵的操作
问题: 如果只存储稀疏矩阵中的非零元素,那这些元素的 位置信息该如何表示? 解决思路: 对每个非零元素增开若干存储单元,例如存放其所 在的行号和列号,便可准确反映该元素所在位置。 实现方法: 将每个非零元素用一个三元组(i,j,aij)来表示, 则每个稀疏矩阵可用一个三元组表来表示。
18
压缩转置算法的效率分析: 1、主要时间消耗在查找M.data[p].j=col的元素,由两重循 环完成: for(col=1; col<=M.nu; col++) 循环次数=nu {for(p=1; p<=M.tu; p++) 循环次数=tu 所以该算法的时间复杂度为O(nu*tu) ----即M的列数与M中非零元素的个数之积 最恶劣情况:M中全是非零元素,此时tu=mu*nu, 时间复杂度为 O(nu2*mu ) 注:若M中基本上是非零元素时,即使用非压缩传统转置算法 的时间复杂度也不过是O(nu*mu) (程序见教材P99) 结论:压缩转置算法不能滥用。 前提:仅适用于非零元素个数很少(即tu<<mu*nu)的情况。
第五章 数组与广义表

第五章数组、特殊矩阵和广义表本章介绍的数组与广义表可视为线性表的推广,其特点是数据元素仍然是一个表。
本章讨论多维数组的逻辑结构和存储结构、特殊矩阵、矩阵的压缩存储、广义表的逻辑结构和存储结构等。
5.1 多维数组5.1.1 数组的逻辑结构数组是我们很熟悉的一种数据结构,它可以看作线性表的推广。
数组作为一种数据结构其特点是结构中的元素本身可以是具有某种结构的数据,但属于同一数据类型,比如:一维数组可以看作一个线性表,二维数组可以看作“数据元素是一维数组”的一维数组,三维数组可以看作“数据元素是二维数组”的一维数组,依此类推。
图5.1是一个m行n 列的二维数组。
标识,因此,在数组上不能做插入、删除数据元素的操作。
通常在各种高级语言中数组一旦被定义,每一维的大小及上下界都不能改变。
在数组中通常做下面两种操作:(1)取值操作:给定一组下标,读其对应的数据元素。
(2)赋值操作:给定一组下标,存储或修改与其相对应的数据元素。
我们着重研究二维和三维数组,因为它们的应用是广泛的,尤其是二维数组。
5.1.2 数组的内存映象现在来讨论数组在计算机中的存储表示。
通常,数组在内存被映象为向量,即用向量作为数组的一种存储结构,这是因为内存的地址空间是一维的,数组的行列固定后,通过一个映象函数,则可根据数组元素的下标得到它的存储地址。
对于一维数组按下标顺序分配即可。
对多维数组分配时,要把它的元素映象存储在一维存储器中,一般有两种存储方式:一是以行为主序(或先行后列)的顺序存放,如BASIC、PASCAL、COBOL、C等程序设计语言中用的是以行为主的顺序分配,即一行分配完了接着分配下一行。
另一种是以列为主序(先列后行)的顺序存放,如FORTRAN语言中,用的是以列为主序的分配顺序,即一列一列地分配。
以行为主序的分配规律是:最右边的下标先变化,即最右下标从小到大,循环一遍后,右边第二个下标再变,…,从右向左,最后是左下标。
以列为主序分配的规律恰好相反:最左边的下标先变化,即最左下标从小到大,循环一遍后,左边第二个下标再变,…,从左向右,最后是右下标。
第五章数组和广义表
稀疏矩阵M存在
由稀疏矩阵M复制 得到T
稀疏矩阵M与N的行 求稀疏矩阵的和Q 数和列数对应相等 =M+N
稀疏矩阵M与N的行 求稀疏矩阵的差Q 数和列数对应相等 =M-N
稀疏矩阵M的列数 求稀疏矩阵乘积Q
等于N的行数
=M*N
稀疏矩阵M存在
求稀疏矩阵M的转 置矩阵T
M.chead
M.rhead
30 05
113
145
M = 0 -1 0 0
2 000
2 2 -1
312
稀疏矩阵的十字链表存储表示:
typedef struct OLNode { int i, j ; // 非零元的行和列下标 ElemType e ; Struct OLNode *right, *down ; // 该非零元所在行表和列表的后继链域
1 当i
j
a00 a10 a11 a20 k= 0 1 2 3
… an-1, 0 … n(n-1)/2
an-1, n-1 n(n+1)/2-1
ADT SparseMatris { 数据对象:
D = { aij | i = 1, 2, …, m; j =1, 2, … , n; aij∈ElemSet,m和n分别称为矩阵的行数和列数}
第五章 数组和广义表
ADT Array { 数据对象:{ ji = 0, … , bi-1 , i = 1, 2 , … ,
n, D = { aj1j2…jn | n ( > 0 )称为数组的维数, bi是数组第i维的长度, ji是数组元素的第i维下标, aj1j2…jn∈ElemSet } 数据关系:R = { R1, R2, …, Rn }
第五章数组广义表
(1)A=( )
(4)D=(A,B,C)
(2)B=(e)
(5)E=(a,E)
(3)C=(a,(b,c,d))
广义表的长度指广义表中元素的个数。
广义表的深度指广义表中括弧的重数。
从上述定义和例子可推出三个重要结论:
(1)列表的元素可以是子表,而子表的元素还可 以是子表,…。
(2)列表可以为其它列表所共享。 (3)列表可以是一个递归的表。 一、广义表的存储结构 由于广义表(a1,a2,a3,…,an)中的元素可以具有 不同的结构,因此难以用顺序存储结构表示。通 常采用链式存储结构,每个数据元素可用一个结 点表示。
else { *elem= A.elem[index1][index2];
return OK; } }
5.3矩阵的压缩存储
矩阵是在很多科学与工程计算中遇到的数学模型。 在数学上,矩阵是这样定义的:它是一个由s×n个元
素排成的s行(横向)n列(纵向)的表。下面就是一
个矩阵:
a11 a12 a 21 a 22 ... ... am1 am 2
第五章 数组和广义表
本章主要介绍下列内容 数组的定义 数组的顺序表示和实现 矩阵的压缩存储 稀疏矩阵 广义表
5.1 数组的定义
一、数组的定义和基本运算 数组的特点是每个数据元素可以又是一个线性表 结构。因此,数组结构可以简单地定义为:若线性表 中的数据元素为非结构的简单元素,则称为一维数组, 即为向量;若一维数组中的数据元素又是一维数组结 构,则称为二维数组;依次类推,若二维数组中的元 素又是一个一维数组结构,则称作三维数组。 结论:线性表结构是数组结构的一个特例,而数 组结构又是线性表结构的扩展。举例:
... a1n ... a 2 n ... ... ... amn 图5-2 Nhomakorabea×n的矩阵
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
例1,二维数组a[0..2][0..5]按“行优先顺序”存储在内存 中,假设每个元素占用2个字节,LOC(a[0][0])=10, 求LOC(a[2][3])。 解:m=3,n=6, LOC(a[2][3])=LOC(a[0][0])+(i*n+j)*R =10+(2*6+3)*2 =40
Homework: For array a[0..2][0..5] stored with column major order. Let sizeof(a[0][0])=2, LOC(a[0][0])=50, compute LOC(a[2][4]).
元素的地址计算(设每个元素占R个单元)
二维: loc(a[i][j])=loc(a[0])+(j*m+i)*R
按上述两种方式顺序存储的数组,只要知道开始结 点的存放地址(即基地址),维数和每维的上、下 界,以及每个数组元素所占用的单元数,就可以将 数组元素的存放地址表示为其下标的线性函数。因 此,数组中的任一元素可以在相同的时间内存取, 即顺序存储的数组是一个随机存取结构。
则称A为对称矩阵。如下图便是一个5阶对称矩阵。 1 5 1 3 7 5 0 8 0 0 1 8 9 2 6 3 0 2 5 1 7 0 6 1 3
对称矩阵中的元素关于主对角线对称,故只要存储矩 阵中上三角或下三角中的元素,让每两个对称的元素 共享一个存储空间,这样,能节约近一半的存储空间。 不失一般性,我们按“行优先顺序”存储主对角线 (包括对角线)以下的元素,其存储的元素如图所示:
LOC(a[2][4])=LOC(a[0][0])+(j*m+i)*R =50+(4*3+2)*2 =78
5.3
矩阵的压缩存储
compression of matrix
一、特殊矩阵 special ma学与工程计算问题中,矩阵是一种常用的数 学对象,在高级语言编制程序时,简单而又自然 的方法,就是将一个矩阵描述为一个二维数组。 矩阵在这种存储表示之下,可以对其元素进行随 机存取,各种矩阵运算也非常简单,并且存储的 密度为1。 • 但是在矩阵中非零元素呈某种规律分布或者矩阵 中出现大量的零元素的情况下,看起来存储密度 仍为1,但实际上占用了许多单元去存储重复的非 零元素或零元素,这对高阶矩阵会造成极大的浪 费,为了节省存储空间, 我们可以对这类矩阵进 行压缩存储:即为多个相同的非零元素只分配一 个存储空间;对零元素不分配空间。
通常有两种顺序存储方式: ⑴行优先顺序row major order——将数组元素按行 排列,第i+1个行向量紧接在第i个行向量后面。以 二维数组为例,按行优先顺序存储的线性序列为: a00,a01,…,a0n-1,a10,a11,…a1n-1,……,,…,am-1n-1 在PASCAL、C语言中,数组就是按行优先顺序存 储的。
元素的地址计算(设每个元素占R个单元) 一维:loc(a[i])=loc(a[0])+i*R 二维: loc(a[i][j])=loc(a[0])+(i*n+j)*R
三维:a[d1][d2][d3], 想象成有d1页,每页有d2行d3列 loc(a[i][j][k])=loc(a[0][0][0])+ (d2*d3*i+d3*j+k)*R 思考:n维,计算地址?
在C语言中,一个二维数组定义为 int array2[m][n];
5.2
数组的顺序表示
representation of arrays
• 由于对数组一般不做整体插入和删除操作,也就 是说,数组一旦建立,结构中的元素个数和元素 间的关系就不再发生变化。因此,一般都是采用 顺序存储的方法来表示数组。 • 顺序存储结构:用一组地址连续的存储单元依次 存放数据元素,称为数组的顺序存储结构。 • 组成数组结构的元素可以是多维的,由于计算机 的内存结构是一维的,因此用一维内存来表示多 维数组,就必须按某种次序将数组元素排成一维 序列,然后将这个线性序列存放在存储器中。
一、特殊矩阵special matrix
• 所谓特殊矩阵是指非零元素或零元素的分布有一定规律的矩 阵,常见的这类矩阵有:对称矩阵、下(上)三角矩阵、对 角线矩阵等等。下面我们讨论几种特殊矩阵的压缩存储。 1、对称矩阵 symmetric matrix 在一个n阶方阵A中,若元素满足下述性质:
aij = aji 1≦i,j≦n
二维数组可以看成是
由行向量组成的向 量,也可以看成是由 列向量组成的向量。
数组结构可以简单地定义为:若线性表中的数据元素
为非结构的简单元素,则称为一维数组,即为向量;若 一维数组中的数据元素又是一维数组结构,则称为二维 数组;依次类推,可把n维数组看成是一个线性表,表中每一个 数据元素是一个n-1维数组。 。 结论:数组结构又是线性表结构的扩展。
5.1 数组的定义
definition of arrays
数组是我们最熟悉的数据类型。由于数组中各元 素具有相同类型same type ,并且数组元素的下 标一般具有固定的上界和下界,因此,数组的处 理比其它复杂的结构更为简单。多维数组是向量 (一维数组)的推广。例如,二维数组:
Amn=
a01 … a0n-1 a11 … a1n-1 … … …… am-10 am-11 … am-1n-1 a00 a10
第五章
数组和广义表
chapter 5
arrays and generalized lists
• 5.1 数组的定义 definition of arrays • 5.2 数组的表示 representation of arrays • 5.3 矩阵的压缩存储 compression of matrix • *5.4 广义表的定义及存储结构
⑵列优先顺序column major order——将数组元素 按列向量排列,第j+1个列向量紧接在第j个列向 量之后,A的m*n个元素按列优先顺序存储的线性 序列为: a11,a21,…,am1,a12,a22,…am2,……,an1,an2,…,anm 在FORTRAN语言中,数组就是按列优先顺序存储的。