数据结构与算法(十一)-- 数组与矩阵

30 篇文章 4 订阅
30 篇文章 0 订阅

 数组与矩阵

1.数组:

数组是由n个相同类型的数据元素构成的有限序列,每个数据元素成为一个数组元素,每个元素受n个线性关系。

一维数组:(a0,a1,a2,...,an)

二维数组: [(a0,0  ,  a0,1  ,  a0,2),(a1,0 , a1,1  ,a1,2)...]

数组维度和维界不可变,除了初始化和销毁外,只有存储元素和修改元素的操作

存储结构为顺序存储,一维数组:

在储存空间上连续

二维数组优先存储次序

1.按行优先:先将每一行的所有列的数据元素存储完成,再储存下一行的数据元素

计算 ai,j 数据元素的位置:Loc(ai,j) = Loc(a0,0)+i*(n+1)*L+j*L  (L为元素大小)  将ai,j之前之前所有行和列大小累加

2.按列优先:先将每一列的所有行的数据元素存储完成,再储存下一列的数据元素

计算 ai,j 数据元素的位置:Loc(ai,j) = Loc(a0,0)+j*(n+1)*L+i*L  (L为元素大小)  将ai,j之前之前所有行和列大小累加

三维数组Am×s×t以按行优先进行存储,存储空间首地址Loc(a(0,0,0))=LOC(0,0,0),每个数组元素占L个存储单元,

ai,j,k数据元素的位置: Loc(ai,j,k) = LOC(0,0,0)+i*s*t*L+j*t*L+k*L

n维数组Ab1×b2××bn,其地址公式为:LOC(j1,j2,,jn) = LOC(0,0,…,0)+j1*b2*…*bn*L+j2*b3*…*bn*L+…+jn-1*bn*L+jn*L

n维数组,除需长为b1*b2**bn的连续空间存储数据元素外,还需记录数组的维数n和各维的维界bi,为提高存取效率,可将求址常量ci也保存下来,cn=1。

存储结构实现:

#define MAX_ARRAY_DIM 8 //定义最大维数
typedef struct{
 ElemType *base; //保存数组元素存储空间首地址
 int dim; //保存数组维数
 int *bounds; //指向保存各维维界的存储空间
 int *constants; //指向保存求址常量的存储空间
}Array;

矩阵的压缩存储

A = [ a11  a12  a13

        a21  a22  a23

        a31  a32  a33]            矩阵通常以二维数组的形式进行表示

矩阵的压缩存储:对具有多个值相同的数据元素只分配一个存储空间,对零元素不分配存储空间。

特殊矩阵:值具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或者零元素的分布有一定的规律性的矩阵。

特殊矩阵的压缩存储:

找出特殊矩阵中值相同的矩阵元素分布规律,把那些呈现规律性分别值、相同的多个矩阵元素压缩存储到一个存储空间。

对称矩阵:若对一个n阶方阵A[1...n][1...n]中任意元素ai,j都有ai,j=aj,i,则称其为对称矩阵。

  矩阵中i<j部分为上三角区,i>j部分为下三角区   其中ai,j=aj,i      i=j为主对角线

存放数量为B[n(n+1)/2]

按行优先 计算ai,j存数中的位置

数组下标 k = 1+2+...+(i-1)+j-1+1-1      ,其中1+2+...+(i-1)为之前行与列的求和,1-1为该行之前的元素

1. 求数组下标,k为位置需要+1

2.默认下标从0开始,需从零开始计算

数组下标k = i*(i-1)/2 + j-1  ; i>=j (下三角区)             k = j*(j-1)/2 + i-1  ;i<j(上三角区)

三角矩阵若对一个n阶方阵A[1...n][1...n]中上(下)三角区元素均为同一常量,则称为下(上)三角矩阵。

下三角矩阵:                                                  上三角矩阵:

                                     

存放数组数量:B[n(n+1)/2 + 1], 最后一位存放同一常量

下三角矩阵存放次序区别:

数组下标k = (i-1)*(2n+2-i)/2 + (j-1)  ; i>=j       ,其中 n+2-i 为i行元素个数,+n为第一行元素个数 ,j-1为当前行的元素  

              k =  n(n+1)/2 ;  i<j

对角矩阵:若对一个方阵(n*m)A中任意元素ai,j ,当|i-j|>1,有ai,j = 0 (1<=i , j<=n),则称为三角矩阵

将矩阵中的非零元按某种次序(行序、对角线顺序等)存储于一组地址连续的存储单元。

数组ai,j下标 k = 3(i-1)-1+j-i+1,其中(i-1)为行数,3(i-1)-1为数组下标,j-i+1为该元素之前元素个数

ai,j的下标:k = 2i+j-3

若已知k,求i,j? i = [(k+1)/3+1]  ,其中(k+1)/3为之前行数          j = k-2i+3

稀疏阵

设在m×n矩阵中,有t个数据元素不为零。当s远远大于t时,称该矩阵为稀疏矩阵。

对稀疏矩阵进行压缩存储时,可只保存其中非零元,同时还需指明非零元所处的行列位置及总的行数、列数。

使用三元组进行存储

行标     列标      值

   i            j       value

  0           1         12

  0           2          9

  2           0         -3

  2           5         14

  3           2         24

  4           1         18

  5           2          -7

稀疏矩阵的特点: 节约空间,但是稀疏矩阵压缩丢失了随机存储特性。

   稀疏矩阵定义:

#define MAXSIZE 1000//非零元最大个数

typedef struct{
 int i; //行下标
 int j; //列下标
 ElemType e; //非零元值
}Triple; //三元组类型

三元组定义:

typedef struct {
 Triple data[MAXSIZE];//三元组表
 int m; //行数
 int n; //列数
 int t; //非零元个数
}TSMatrix;

mn列的矩阵M转置为矩阵T的经典算法为:

   for(i=1;i<=m;++i)

    for(j=1;j<=n;++j)

     Tji=Mij;

算法的时间复杂度为O(m*n)

操作步骤:

交换矩阵行列数;         ⑵交换每个三元组中的行列下标;            ⑶重排三元组,使之按行序排列。

T中三元组的次序依次在M中找到相应的三元组进行转置,即按M的列序进行转置。

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值