数据结构-数组和特殊矩阵

208 阅读3分钟

数组的定义

数组是由n个同类型的数据元素构成的优先序列,每个数组中的数据元素称为一个数组元素。

从某种意义上,数组一种线性表的拓展:一维数组可以看作一个线性表,而二维数组就可以看作成一个各个数据元素是该类型一维数组的一个线性表,以此类推。

数组是一种有限序列,其大小一旦被定义,就无法再次修改,只允许进行数据的赋值、修改和取用。

数组的结构

在计算机中,一个数组中的数据元素占用一段连续的内存空间,例如数组元素a[0]在内存空间中的下一个数组元素就是a[1]。

而在多维数组中,数组的数组元素就无法像一维数组那样让各个数组元素在内存空间中连续依次存放,所以必须要考虑数组元素的存放顺序。如二维数组b[i][j],可以按照行优先(先排b[0][j],之后一行行以此类推)或者列优先(先排b[i][0],之后再一列列依次类推)在内存中存储。

例如数组test[3][3],在内存空间中的存储方式就有两种:
1. 行优先
	test[0][0] test[0][1] test[0][2] test[1][0] test[1][1] test[1][2] test[2][0] test[2][1] test[2][2]
2. 列优先
	test[0][0] test[1][0] test[2][0] test[0][1] test[1][1] test[2][1] test[0][2] test[1][2] test[2][2]

特殊矩阵的存储

矩阵在计算机中可以看作是一个二维数组,但是多个二维数组势必会占用大量的内存空间,而矩阵当中时常会出现特殊类型的矩阵(比如对称矩阵、上下三角矩阵等等)。这时,我们可以采用一些手段,来节省这些矩阵占用的内存空间。这就是特殊矩阵在计算机当中的压缩存储。

对称矩阵

对称矩阵是指在矩阵aa中,任何一个数据元素ai,ja_{i,j}都有ai,ja_{i,j}=aj,ia_{j,i}。对于这种矩阵,由于有近一半的数据元素的值是一样的,所以采用一维数组存储较之于使用二维数组,可以节省一半的内存空间。

设矩阵aa存放在数组a_1中,其各个数据元素下标为k,那么一维数组下标与原矩阵的对应关系为:

  1. iji \ge j时,k=i(i1)2+j1k=\frac{i*(i-1)}{2}+j-1
  2. i<ji < j时,k=j(j1)2+i1k=\frac{j*(j-1)}{2}+i-1

三角矩阵

三角矩阵分为上三角矩阵和下三角矩阵,即除了三角部分的数据元素外,剩下的矩阵部分数据元素都是0。和对称矩阵一样,如果采用一维数组存储,将会比使用二维数组节省一半的空间。

在下三角矩阵中,只需要按照行优先顺序进行排列到一维数组中即可,即a1,1a_{1,1}之后存放a2,1a_{2,1}。上三角矩阵同理。

稀疏矩阵

稀疏矩阵是指矩阵当中大部分都是0元素,非零元素很少。如果按照二维数组存储,空间利用率极低。

我们一般使用一个三元组存放这个矩阵当中非0元素在矩阵当中的位置,三元组分别存放该元素的行标、列标和值。