- 1、本文档共63页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
第05章数组和广义表-副本
第五章 数组和广义表;5.1数组的定义;例如,二维数组A: ;由于计算机的内存结构是一维的,因此用一维内存来表示多维数组,就必须按某种次序将数组元素排成一列序列,然后将这个线性序列存放在存储器中。
数组一旦建立,结构中的元素个数和元素间的关系就不再发生变化。因此,一般采用顺序存储的方法来表示数组。;行优先顺序或以行为主序存储方式:将数组元素按行排列,第i+1个行向量紧接在第i个行向量后面。以二维数组为例,按行优先顺序存储的线性序列为: a11,a12,…,a1n,a21,a22,…a2n,……,am1,am2,…,amn
在PASCAL、C等语言中,数组就是按行优先顺序存储的。;列优先顺序或以列为主序存储方式:将数组元素按列向量排列,第j+1个列向量紧接在第j个列向量之后,A的m*n个元素按列优先顺序存储的线性序列为:
a11,a21,…,am1,a12,a22,…am2,……,an1,an2,…,anm
在FORTRAN语言中,数组按列优先顺序存储。;行优先顺序——先排最右的下标,从右到左,最后排最左下标。
列优先顺序——先排最左下标,从右向左,最后排最右下标。
例如:三维数组Am*n*p;只要知道开始结点的存放地址(即基地址)、维数和每维的上、下界,以及每个数组元素所占用的单元数,就可以将数组元素的存放地址表示为其下标的线性函数。因此,数组中的任一元素可以在相同的时间内存取,即顺序存储的数组是一个随机存取结构。;压缩存储:为多个值相同的非零元素只分配一个存储空间;对零元素不分配空间。;特殊矩阵:非零元素按照一定的规律分布。;5.3.1(续)对称矩阵的压缩存储;5.3.1(续)对称矩阵的压缩存储;5.3.1(续)三角矩阵的压缩存储;5.3.1(续)三角矩阵的压缩存储;5.3.1(续)三角矩阵的压缩存储;5.3.1(续)三角矩阵的压缩存储;5.3.1(续)三对角矩阵的压缩存储;上述各种特殊矩阵,其非零元素的分布都是有规律的,因此总能找到一种方法将它们压缩存储到一维数组中,并且一般都能找到矩阵中的元素与该一维数组元素的对应关系,通过这个关系,仍能对矩阵的元素进行随机存取。;什么是稀疏矩阵?简单说,设矩阵A中有s个非零元素,若s远远小于矩阵元素的总数(即s≦m×n),则称A为稀疏矩阵。
设在矩阵A中,有s个非零元素。令 e=s/(m*n),称e为矩阵的稀疏因子。通常认为e≦0.05时称之为稀疏矩阵。
;5.3.2稀疏矩阵的压缩存储; ( (1,2,12), (1,3,9), (3,1,-3), (3,6,14),
(4,3,24), (5,2,18), (6,1,15), (6,4,-7) );假设以顺序存储结构来表示三元组表,则可得到稀疏矩阵的一种压缩存储方法——三元组顺序表。
#define maxsize 10000
typedef int datatype;
typedef struct{
int i,j;
datatype v;
}triple; /* 三元组*/;typedef struct{
triple data[maxsize];
int m,n,t;
}tripletable;;转置;5.3.2(续)三元组顺序表上的转置;typedef struct{
triple data[maxsize];
int m,n,t;
}tripletable;;5.3.2(续)三元组顺序表上的转置(二);设置向量num,num[col]表示矩阵A中第col列中非零元的个数。(A的列数:A.n);设置向量cpot,cpot[col]指示A中第col列的第一个非零元在转置矩阵AT.data中的恰当位置。;5.3.2(续)三元组顺序表上的转置(二);转置;转置;转置;转置;转置;转置;转置;转置;转置;转置;for(col=1;col=A.n;++col) num[col] = 0;
for(p=1;p=A.t;++p) //计算A中每列非零元的个数
num[A.data[p].j]++;;for(col=1;col=A.n;++col) num[col] = 0;
for(p=1;p=A.t;++p) //计算A中每列非零元的个数
num[A.data[p].j]++;;十字链表;5.3广义表的定义;5.3广义表的定义;5.4 广义表???定义;5.4 广义表的定义;5.4 广义表的定义;5.4 广义表的定义;广义表的存储结构(一);广义表的存储结构(一);广义表的存储结构(一);广义表
文档评论(0)