数组

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

2014-7-9
数据结构(C语言)wh
21
1、三元组表 按照压缩存储概念,这里只需存储稀疏矩阵中的非零元素。但 是,为了实现矩阵的各种运算,除了存储非零元素的值外,还必 须同时记下它所在的行和列,以此,可用一个三元组(i,j,aij) 惟一地确定矩阵中的一个非零元素,其中i、j分别表示非零元素 所在的行号和列号,aij 表示非零元素的值。下列8个三元组表示 了上述矩阵M的8个非零元素。 (1,1,15) (1,4,22) (1,6,15) (2,2,11) (2,3,3) (3,4,6) (5,1,91) (6,3,28) 若以行为主的顺序将这8个三元组排列起来,再加上一个表示 矩阵M的行数、列数及非零元素的个数的特殊三元组(6,6,8), 则所形成的表就能惟一确定稀疏矩阵M。 假设以顺序存储结构来表示三元组表(Triple Table),则可 得到稀疏矩阵的一种压缩存储方式,即三元组顺序表,简称三元 组表,其结构描述如下:
2014-7-9
数据结构(C语言)wh
4
通常为书写算法简单,也可扩大数组,使其成为 m+1 行,n+1列。仅使用数组第1行至第m行,第1列至第n列, 第0行、0列的元素虽然存在,但空着不使用,也可另作 他用,这样做的目的为的是让和数组元素与矩阵元素对 应。 在C语言中,一个二维数组可以用其分量为一维数组 的数组来定义。同样,一个三维数组可以用其数据元素 为二维数组的线性表来定义,依次类推,可得到n维数 组的递归定义。
2014-7-9
数据结构(C语言)wh
17
这些特殊矩阵的共同特点是非零元素的分布有明显的规律,因而都可 以压缩到一维数组中,并找到每个非零元素在与之等价的一维数组中的 对应的位置。 对于对称矩阵,可以为每对对称元素仅分配一个存储空间,这样,n2 个元素被压缩到n(n+1)/2个元素的空间(包括对角线上的元素)。通常 可采用以行为主的顺序来存储其下三角中的元素。假设以一维数组 s[n(n+1)/2 ]作为n阶对称矩阵A的存储结构,则s中任意元素s[k]与矩 阵元素aij 的下标之间存在着一一对应的关系:
2014-7-9
数据结构(C语言)wh
11
(b) 以行为主序的三维数组内存 表示
2014-7-9
数据结构(C语言)wh
12
以上所给出的寻址公式都是以行为主进行分配的。在以列 为主的顺序分配中,数组元素地址的计算公式读者可仿照以 行为主的计算公式自行推导。值得注意的是C语言中数组的 各维下界均固定为0,而其他语言不一定为0,因此计算公式 略有变化。

2014-7-9
数据结构(C语言)wh
16
4.2.1 特殊矩阵及其压缩存储
对称矩阵、三角矩阵和三对角矩阵等都属于特殊矩阵。若一个n阶方阵 A中的元素满足 aij=aij (1≤ i,j ≤ n) 则称A为对称矩阵;当一个方阵的主对角线上方或下方的所有元素皆为 0时,该矩阵称为三角矩阵;除了主对角线和紧靠在主对角线上、下方的 对角线上的元素外,其他所有元素均为0的矩阵是三对角矩阵。图4.4所示 是这两种特殊矩阵的形式。
2014-7-9
数据结构(C语言)wh
2
从本质上讲,数组是下标-值偶对(Index Value Pairs)的集合,其 中每个元素都由一个值(Value)和一组下标(Index)组成。在数组中, 对于一组有意义的下标,都存在一个与其相对应的值,这种下标与值一 一对应的关系乃是数组结构的特点。例如在C程序设计语言中有一个m行, n列的二维数组a,可以表示为:
2014-7-9
数据结构(C语言)wh
5
4.1.2 数组的主要运算
通常,线性表的长度是可以变的,而数组的大小(所包含元素的 个数)却是固定的,因此,对数组而言,主要的运算是以下几 种: 1) ArrayInit (&a,n,b1,b2,…,bn) 若维数n和各维长度b1,b2,…,bn 合法,则构造相应的数组a,并 返回1。 2) ArrayDestory (&a) 销毁已存在的数组a。 3) ArrayAsssign (&a, e, i1,i2…,in) 若各维下标i1,i2, …,in不越界,则将e的值赋给数组元素 a[i1][i2] …[in]。

在高级语言中,普遍是用二维数组来表示矩 阵的。这样,利用上一节所介绍的地址计算公式, 就可以快速地访问矩阵中的每个元素。
2014-7-9
数据结构(C语言)wh
15

然而,实际应用中也常常会遇到一些阶数很 高的矩阵,它们或者有许多值相同的元素或者有 大量的零元素。为了节省空间,可以对这类矩阵 进行压缩存储。所谓压缩存储的含义是:为多个 值相同的元素只分配一个存储空间;对零元素不 分配空间。 如果值相同的元素或零元素在矩阵中的分布 有一定的规律,则称这类矩阵为特殊矩阵,反之, 称为稀疏矩阵。下面分别介绍这两类矩阵的压缩 存储。
2014-7-9
数据结构(C语言)wh
10
因为在A[i,0]之前有i行(第0行至第i-1行),而每行有n个元素。在知 道了A[i,0]的地址之后,就不难得到任意元素A[i][j]的存储地址了。若 每个元素占l个存储单元,则对应公式为: LOC(i,j)= b +(i×n+j)×l 推广到一般的二维数组:a[c1..d1][c2..d2],若按以行为主的顺序存储 在内存中,假设每个元素占l个单元,则任意元素aij的物理地址计算公式 为: LOC(aij)=LOC(a c1 c2)+[(i- c1)×( d2 - c2 + 1)+(j- c2)]×l 同理对于一般三维数组:A[c1..d1][c2..d2][c3..d3],则任意元素aijk的 物理地址为: LOC(i,j,k)=LOC(a c1 c2 c3)+[(i-c1)×(d2 -c2 +1)×(d3-c3 +1)+(jc2)×(d3-c3+1)+(k-c3))×l 三维数组的逻辑结构和以行为主序的分配示意图如图4.3所示。其中第 一维表示行号,第二维表示列号,第三维表示平面号。
2014-7-9
数据结构(C语言)wh
8
下面讨论多维数组的分配。计算机内存是一维物理结构,为了在一 维的内存中表示多维的数组,可以用一个等价的一维数组来代替多维数 组,即把多维数组变换成一维数组的形式。 例如,一个二维数组b[2][3], 逻辑上它是一个2行3列的矩阵:
2014-7-9
数据结构(C语言)wh

2014-7-9 数据结构(C语言)wh 13
综上所述,不难得出如下结论:为了算出数组元素在内存 中的地址,除了要知道数组元素的存储顺序外,还必须知道该 数组各维的长度、数组中第1个元素在存储器的存储地址以及 每个元素的长度。

例:假设有一个实型二维数组a[5][4],其在内存的首地址 是2000,求数组元素a[3][2]的内存地址。 由于C语言中的数组是行为主的存储方式,实型数组每个元 素占4个字节,故根据公式有:LOC(3,2)= LOC(0,0)+(i×n+j)×l = 2000+(3×4+2)×4 = 2056
2014-7-9
数据结构(C语言)wh
6
4) ArrayValue (a, &e, i1,i2…,in ) 若各维下标i1,i2…,in不越界, 则数组元素a[i1][i2]…[in]的值赋 给变量e。 5) ArrayCope (a, &b) 若数组a已存在,按数组a构造数组b,并将a元素的值复制到b。

4

数组及其应用
2014-7-9
数据结构(C语言)wh
1
4.1数组及其数组的顺序分配
4.1.1 数组的概念
数组(Array)是我们熟悉的数据类型,几乎在所有的高级语言 中都可使用数组,数组中各元素必须具有统一的类型。在各种高级 语言中数组一旦被定义,每一维的大小及上下界都不能改变,每一 个数据元素均由唯一的一组下标来标识。因此,在数组上不能做插 入、删除数据元素的操作,通常只能做如下两种操作: (1)取值操作:给定一组下标,读其对应的数据元素。 (2)赋值操作:给定一组下标,存储或修改与其相对应的数据元素。 高级语言中的数组在计算机内是用一批连续的存储单元来表示的,称为 数组的顺序存储结构。实际中用户还可以根据需要选择数组的其他 存储方式。
a中每一个元素都和一个二维空间的二元组(i,j)(0≤i≤m-1,0≤j≤n-1) 相对应。类似地,每一个元素都和一个n维空间的n元组相对应的数组是 n维数组。
2014-7-9
数据结构(C语言)wh
ຫໍສະໝຸດ Baidu
3
线性表(a1 ,a2 ,… an )可以看作是一个一维数组,若元素 类型定义为elementype,则该数组可以记作elementype a[n]。而二维 数组a[m][n]可以看作由m个长度为n的线性表(每一行为一个线性表) 或者是由n个长度为m的线性表(每一列为一个线性表)所组成的。因 此,可以说数组是线性表的一个推广,而线性表是数组的一种特殊情 况,其情况如下所示。
2014-7-9
数据结构(C语言)wh
19
总而言之,对于其他特殊矩阵,如三角矩阵和三对 角矩阵等的压缩存储与对称矩阵的压缩存储非常类似。 三角矩阵的存储一般采用以行为主的顺序,而三对角 矩阵的存储可采用以列为主的顺序,也可采用对角线 的顺序。不论采用哪种顺序,都应能找到一维数组元 素和矩阵元素之间的一一对应关系为基本原则。
2014-7-9
数据结构(C语言)wh
18
称一维数组s[(n+1)/2]为n阶对称矩阵A的压缩存储,其存储对应关 系如图4.5所示。从图中可以看到,对于任意给定的一组下标(i,j), 均 可 在 s 中 找 到 矩 阵 元 素 aij ; 反 之 , 对 所 有 的 k (k=0,1,2,…,n(n+1)/2),都能确定s[k]中的矩阵元素在矩阵中的位置 (i,j)。

这里还特别提起注意的是,在C语言中数组的顺序分配允 许有两种方法:静态存储分配和动态存储分配,简称静态数 组和动态数组。这两种分配方法在本书中都会用到。

静态数组是指在程序运行期间数组大小是静态的,不能改 变的,数组大小在程序种预先给出,在程序编译时建立。动 态数组是指在程序执行过程中,动态建立和撤消的数组。
2014-7-9
数据结构(C语言)wh
7
4.1.3 数组的顺序存储结构
图4.1 一维数组的存储表示 在计算机中,如果用一批连续的存储单元来表 示数组,则称为数组的顺序分配。数组的这种存储 方式是采用计算地址的方法来实现的。 一维数组比较简单,其地址计算公式和线性表 的顺序分配一样,假设数组a[n]的每个元素占一个 存储单元,其第一个元素的首地址用b表示,如图 4.1所示,则数组a[n]中第i个元素a[i](0≤i≤n1)的存储地址为 LOC(i)=b+i 一般情况下,如果有数组每个元素占l个单元, 则任意元素a[i]的地址可由下列更一般的公式计算: LOC(i)=b+i×1
9
但在计算机内存中,它只能按一维的形式存放在一组连续组连续的 存储单元里,一般有两种实现方法: (1)按行顺序存储,称为以行为主(Row Major Order)order)的 顺序分配。在PASCAL、COBOL、BASIC、C等语言等语言中都采用这种分 配方式。 (2)按列顺序存储,称为以列为主(Column Major Order) order)的顺序分配,这种方法为FORTRAN语言所用。 图4.2展示了数组 b的顺序分配。 顺序分配的数组是一种随机存取的结构,只要给定数组元素的下标 便可找到它的存储器中的位置。下面仅以以行为主的顺序分配方式为 例进行讨论。 设有一个二维数组a[m][n],其每个元素占一个存储单元。假设b为 第一个元素a[0][0]的存储首地址,则任意元素a[i][j]的地址可由下 式确定: LOC(i,j)= b + i×n+ j

2014-7-9 数据结构(C语言)wh 14
4.2矩阵的压缩存储

矩阵(Matrix)在科学计算与工程计算中有着 广泛的应用。在此,我们关心的不是矩阵本身, 而关心在计算机中如何表示矩阵,以便使矩阵的 各种运算能有效地进行。人们一般用m×n表示一 个具有m行n列的矩阵。该矩阵共有m×n个元素。
2014-7-9
数据结构(C语言)wh
20
4.2.2 稀疏矩阵
在实际应用中,往往会遇到这样一种矩阵,其中大多数元素 的值为0,而只有少数非零元素。这些非零元素在矩阵中的分布没有 一定的规律,通常称这种矩阵称为稀疏矩阵(Sparse Matrix)。至 于非零元素少到多少才算稀疏并无确切定义,在实际中一般考虑所选 的压缩存储是否节省了存储空间。例如,下面所示的矩阵M和它的转 置矩阵N,在36个元素中只有8个非零元素,显然它们都是稀疏矩阵。
相关文档
最新文档