数组的定义、顺序存储及特殊矩阵的存储

目录

一、数组的定义

1.1概念

1.2抽象数据类型定义

二、数组的顺序存储

2.1一维数组元素的存储位置

2.2二维数组元素的存储位置

2.3三维数组元素的存储位置

三、特殊矩阵的压缩存储

3.1相关概念

3.2对称矩阵

3.3三角矩阵

3.4对角矩阵(带状矩阵)

3.5稀疏矩阵


一、数组的定义

1.1概念

数组是按一定格式排列起来的具有相同类型的数据元素的集合

·声明格式: 数据类型 变量名称[长度];

例:int num[5]={0,1,2,3,4};

1.2抽象数据类型定义

ADT Array{

数据对象:j(i)=0,... b(i)-1, i=1,2,.....,n

                  D={a(j1j2....j(n)) | a(j1j2.....j(n)) ∈ElemSet}

数据关系:R1={<a(j1...j(i)...j(n),a(j1...j(i+1)...j(n))> | 0<=j(k)<=b(k)-1,1<=k<=n,且k≠i,0<=j(i)<=b(k)-2, a(j1...j(i)...j(n)), a(j1...j(i+1)...j(n) ∈D,i=2,...,n}

基本操作:

①InitArray(&A,n,bound1,...boundn)   //构造数组A

②DestroyArray(&A)   //销毁数组A

③Value(A,&e,index1,...,indexn)   //取数组元素值

④Assign(A,&e,index1,...indexn)  //给数组元素赋值

}ADT Array

二、数组的顺序存储

2.1一维数组元素的存储位置

LOC(i)=LOC(0)=a,i=0;

LOC(i)=LOC(i-1)+L=a+i*L,i>0

例:每个元素占4字节,假设a[0]存储在2000单元,则a[3]地址为:2000+3*4=2012单元

 2.2二维数组元素的存储位置

我们先来讨论一下二维数组的存储方式:

①以行序为主序

②以列序为主序

二维数组元素的存储位置:(行优先的顺序存储)

a[i][j]的存储位置:LOC(i,j)=LOC(0,0)+(n*i+j)*L

(n*i+j)表示在a[i][j]前面所有元素个数

例:

2.3三维数组元素的存储位置

我们一样先讨论三位数组的存储方式:

三位数组元素的存储位置

三、特殊矩阵的压缩存储

3.1相关概念

①什么是压缩存储:

为多个相同的非零元素只分配一个存储空间;对零元素不分配空间。

②什么样的矩阵能够压缩:

对称矩阵、对角矩阵、三角矩阵、稀疏矩阵

③什么叫稀疏矩阵:

矩阵中非零元素的个数较少(一般少于 5%)

3.2对称矩阵

①特点:a(ij)=a(ji)

②存储方法:只存储下(或者上)三角(包括主对角线)的数据元素,共占用n(n+1)/2个元素空间。

③存储结构:可以以行序为主序将元素存放在一个一维数组sa[n(n+1)/2]中

例:以行序为主序存储下三角

k表示元素a(ij)前面有几个元素个数

k=1+2+3+4+...+(i-1)+(j-1) (i-1表示a(ij)前面有i-1行,j-1表示在a(ij)本行前面有几个元素)

以a(n1)为例:k=1+2+3+...+(n-1)+(1-1)=n(n-1)/2

3.3三角矩阵

①特点:对角线以下(或者以上)的数据元素(不包括对角线)全部为常数c

②存储方法:重复元素c共享一个元素存储空间,共占用n(n+1)/2+1个元素(1表示常数c的存储空间)

③存储结构:将元素存放在一个一维数组sa[n(n+1)/2+1]中

·对于上三角矩阵:

·对于下三角矩阵:

k一样表示a(ij)元素前面的元素个数

3.4对角矩阵(带状矩阵)

①特点:在n×n方阵中所有非零元素都集中在以主对角线为中心的带状区域中,区域外的值全为0

常见的有三对角矩阵、五对角矩阵、七对角矩阵等

②存储方法:以对角线的顺序存储

3.5稀疏矩阵

①特点:非零元较零元少,且分布没有规律。

②存储方法:三元组法、十字链表

③存储结构:顺序存储、链式存储

·三元组顺序表法

(i,j,a(ij)) (行数,列数,元素值)+(总行数,总列数,非零元素总个数)

三元组法的优点:便于进行依行顺序处理的矩阵运算;缺点:不能随机存取。

改进:稀疏矩阵的链式存储结构——十字链表

优点:能够灵活地插入因运算而产生的新的非零元素,删除因运算而产生的新的零元素

·十字链表

矩阵的每一个非零元素用一个结点表示,该结点除了(row,col,value)以外,还要有right、down两个域。(right连接同一行中的下一个非零元素,down连接同一列中的下一个非零元素)

结构示意图:

例:

引入头指针:指向行或列中的第一个非零元素

  • 30
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
稀疏矩阵是指矩阵中绝大部分元素为零的矩阵,因此采用顺序表或十字链表等存储方式可以节省存储空间。 1. 顺序表存储稀疏矩阵 首先,我们需要定义一个结构体来表示矩阵中的每个非零元素。结构体中包含三个字段:行号、列号和元素值。 ```c typedef struct { int row; // 行号 int col; // 列号 int val; // 元素值 } Triple; ``` 然后,我们可以使用一个一维数组存储矩阵中的所有非零元素。数组中的每个元素都是一个 Triple 结构体。 ```c #define MAX_SIZE 100 // 数组最大长度 typedef struct { Triple data[MAX_SIZE + 1]; // 存储非零元素的数组 int rows; // 矩阵行数 int cols; // 矩阵列数 int nums; // 矩阵中非零元素个数 } SparseMatrix; ``` 在顺序表中,我们按照行优先的顺序存储矩阵中的非零元素。具体来说,我们先按照行号递增的顺序排序,对于行号相同的元素,再按照列号递增的顺序排序。这样,我们可以通过遍历数组中的元素,依次输出矩阵中的所有元素。 2. 十字链表存储稀疏矩阵 十字链表是一种存储稀疏矩阵的链式存储结构。在十字链表中,每个非零元素都对应一个结点,结点中包含四个指针分别指向行、列、上一个非零元素和下一个非零元素。具体来说,我们可以定义如下结构体来表示十字链表中的结点: ```c typedef struct CrossNode { int row; // 行号 int col; // 列号 int val; // 元素值 struct CrossNode *down; // 指向下一个非零元素 struct CrossNode *right; // 指向右边的非零元素 } CrossNode; ``` 然后,我们可以使用两个数组存储矩阵中的所有非零元素。一个数组存储行链表的头指针,另一个数组存储列链表的头指针。具体来说,我们可以定义如下结构体来表示十字链表: ```c #define MAX_SIZE 100 // 数组最大长度 typedef struct { CrossNode data[MAX_SIZE * MAX_SIZE]; // 存储非零元素的数组 CrossNode *row_heads[MAX_SIZE]; // 行链表头指针数组 CrossNode *col_heads[MAX_SIZE]; // 列链表头指针数组 int rows; // 矩阵行数 int cols; // 矩阵列数 int nums; // 矩阵中非零元素个数 } SparseMatrix; ``` 在十字链表中,我们按照行列优先的顺序存储矩阵中的非零元素。具体来说,我们先按照行号递增的顺序排序,对于行号相同的元素,再按照列号递增的顺序排序。这样,我们可以通过遍历行链表和列链表中的元素,依次输出矩阵中的所有元素。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值