第5章数组和稀疏矩阵

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


3.对称矩阵

若矩阵中的所有元素均满足aij=aji,则称此矩阵为 对称矩阵。 对于对称矩阵,因其元素满足aij=aji ,我们可以 为每一对相等的元素分配一个存储空间,即只存 下三角(或上三角)矩阵,从而将n2个元素压缩 到n(n+1)/2个存储空间中。

返回本章目录
5.2 稀疏矩阵

矩阵中大多数元素的值为零,只有少部分元素的值非零, 并且,这些非零元素在矩阵中的分布没有一定的规律性, 这种矩阵称为稀疏矩阵。 稀疏矩阵的抽象数据类型 (参见教材)
typedef struct
{
OLink * row_head,*col_head;//行、列链表的头指针 int m,n,len;//稀疏矩阵的行数、列数、非零元素数 }CrossList;
数组是一种特殊的数据结构,它用来表示有序的、相同类
型的数据的集合。作为一种静态的数据结构,数组必须在 声明时用常量指定大小。数组元素的访问是通过指定数组 名和下标进行的。
度的节省存储空间,但实现矩阵转置和乘法运算时,即使 借助于一些辅助数组,仍需要耗费较多的时间。十字链表 是三元组的链接表示,它的创建过程更加复杂。
1. C语言中数组下标从0开始,且C语言采用的是按行序为主 序的存储方式,请推导C语言中
1)一维数组元素地址的计算公式。
2)二维数组元素地址的计算公式。
◆为了节省存储空间,可以对这些特殊矩阵进行压缩 存储。
1.下三角矩阵

对于一个n阶矩阵来说,若当i<j时,有,则称此 矩阵为下三角矩阵。

对于下三角矩阵的压缩存储,我们只存储下三角 中的元素,对于其余的零元素则不存。
若已知首元素的存储地址为Loc(1,1),并且知道每 个元素所占的存储空间L,下三角中任意元素aij地 址的计算公式如下: Loc(i,j)=Loc(1,1)+(i*(i-1)/2+(j-1))*L ,i≥ j

2.上三角矩阵

对于一个n阶矩阵,若当i>j时,有,则称此矩阵为上 三角矩阵。

对于上三角矩阵的压缩存储,同下三角矩阵类似,我 们只存储上三角中的元素,对于其余的零元素则不存 。
若已知首元素的存储地址为Loc(1,1),并且知道每个 元素所占的存储空间L,上三角中任意元素aij地址的 计算公式如下: Loc(i,j)=Loc(1,1)+((2n-i+2)*(i-1)/2+(j-i))*L, i≤ j

5.2.1 稀疏矩阵的三元组表示

一个三元组(i,j,aij)便能唯一地确定矩阵中的一个非零 元素,其中,aij表示矩阵第i行第j列非零元素的值。
若以某种方式(如上,按行序为主序的顺序)将各个三元 组排列起来,则所形成的表就能唯一地确定稀疏矩阵,从 而得到稀疏矩阵的一种压缩存储方式,即三元组顺序表。

{ int row,col; //非零元素的行和列下标 data;
ElemType
struct OLNode * right,*down; //非零元素所在行表、列表的后继链域
}OLNode; *OLink;

在稀疏矩阵的十字链表表示中,行链表是由稀疏矩阵中 同行的非零元素组成的链表,列链表是同列的非零元素 组成的链表。一个m×n的矩阵包含m个行链表和n个列 链表。可以用两个一维数组分别存储每个行链表的头指 针和每个列链表的头指针,从而得到十字链表的结构类 型说明如下:
dst->m= src.n ; dst ->n= src.m ;
dst ->len= src.len ;
if(dst->len>0) { j=1; for(k=1; k<= src.n; k++)
for(i=1; i<= src.len; i++)
2.乘法运算

采用三元组顺序表来实现时,由于乘积矩阵的三元 组顺序表仍要按行序为主序的进行存储,可以采用 固定矩阵M的三元组顺序表中的元素(i,k,aik) (1≤i≤q,1≤k≤r),在矩阵N的三元组顺序表中找 所有行号为k的对应元素(k,j,akj)(1≤k≤s, 1≤j≤t)进行相乘、累加,从而得到,并且仅当时矩 阵P的三元组顺序表中才有元素(i,j,pij)。 注意:稀疏矩阵的乘积不一定是稀疏矩阵。 具体算法 (参见教材)


稀疏矩阵的三元组顺序表存储结构 //非零元素的个数最多为1000
#define MAXSIZE 1000 typedef struct { int row,col; ElemType data; } Triple; typedef struct { Triple data[MAXSIZE+1]; int m,n,len;
数组中的元素是按照下标顺序连续存储的,特定元素的存
储位置可以根据数组首元素的地址及该元素相对于首元素 的偏移量进行计算。对于多维数组,不同语言采取的存储 主序是不同的。
特殊矩阵由于元素值呈现出一定的规律性,可以进行压缩
存储以节省存储空间,这就需要对特定元素存储位置的计 算公式进行调整。
稀疏矩阵采用三元组顺序表只存储非零元素虽然可以大幅
第五章 数组和稀疏矩阵
5.1数组的概念与表示 5.2 稀疏矩阵
5.1数组的概念与表示

数组可以看作线性表的推广,或者说是线性表的嵌套。
5.1.1 数组的概念

数组是有序排列的相同类型的数据元素的集合。 数组具有如下两个特征:
(1)数组中的元素是有序的。数组中的元素可以用数组名 和下标指定,下标指出了该元素在数组中的顺序。 (2)数组的元素是相同类型的。数组中存储的所有元素必 须是同一种数据类型,而不能是多种数据类型的混合。
2. 对于矩阵,其每个元素占六个存储单元,且的存储地址为 1500
1)如果是下三角矩阵,求元素的存储地址。
2)如果是上三角矩阵,求元素的存储地址。
3)如果是对称矩阵,保存为下三角矩阵,求元素的存储 地址。
3. 已知稀疏矩阵和如下图所示,试写出这两个矩 阵及其转置矩阵的三元组表示。
结束
ห้องสมุดไป่ตู้


为了找到所有的非零元素,需要对其data域从第1 行起整个扫描一遍。具体算法描述如下。
void Transpose (SMatrix src, Smatrix* dst)
{ int i , j, k ;
if(src.data[i].col==k) { dst->data[j].row = src.data[i].col; dst->data[j].col = src.data[i].row; dst->data[j].data = src.data[i].data; j++; } } }// Transpose

5.2.2 稀疏矩阵的十字链表表示

十字链表又称正交链表,是三元组的链接表示。稀疏矩阵的 每个非零元素仍由三元组表示,这些三元组通过链接方式相 互关联。十字链表的每个结点中除了矩阵元素的三元组信息 外,还包含指向同一行下一个非零元素的指针域(right)和指 向同一列下一个非零元素的指针域(down)。这样,整个矩阵 就构成了一个十字交叉的链表,故称之为十字链表。十字链 表结点的结构类型说明如下: typedef struct OLNode
//该非零元素的行下标和列下标 //该非零元素的值
//非零元素的三元组顺序表,data[0]未用 //矩阵的行数、 列数和非零元素的个数
}SMatrix;
1.转置运算

矩阵的转置:通过变换元素的位置,把位于(row ,col)位置上的元素换到(col,row)位置上, 得到一个新的矩阵。 在稀疏矩阵的三元组顺序表存储结构下,为了保 证转置后矩阵的三元组顺序表仍按行序为主序的 进行存储,需要按照col从小到大的顺序完成元素 位置的变换。

对数组的操作一般只有两类:
(1)获得特定位置的元素值; (2)修改特定位置的元素值。

数组的抽象数据类型(参见教材)
5.1.2 数组的顺序表示
◆对于多维数组,数组元素在一维结构的存储单元中 连续存储时,有个存储的次序问题。
◆对于二维数组,按行序为主序的存储方式和按列序 为主序的存储方式
5.1.3 特殊矩阵的压缩存储
相关文档
最新文档