【DSaAA】矩阵和广义表

矩阵和广义表

二维数组

数组是在逻辑和物理上都相邻的一组有序数据,二维数组是一组在逻辑和物理上都相邻的一维数组。二维数组展开就是矩阵,一般的矩阵都可以用一个维维数组表示,但是针对一些特殊的二维数组,可以用更少的空间来存储,达到压缩的目的。

ADT

假设矩阵的操作只有初始化和打印。

简单矩阵

简单矩阵直接使用二维数组存储:SimpleMatrix.java

对称矩阵

对称矩阵是沿主对角线(左上到右下)对称的矩阵,这种矩阵只需要存储上三角或下三角就可以推导出另外一半,这一半的数据(包括对角线上的数据)直接存储在一维数组中。

可以算出一维数组s[k]的元素个数为 n ( n + 1 ) 2 个,那么对于矩阵中的元素 a i j ,有
a i j = a j i = s m a x ( i , j ) ( m a x ( i , j ) + 1 ) / 2 + m i n ( i , j )

最终矩阵存储的数据大约只有整个矩阵的一半:SymmetricMatrix.java

稀疏矩阵

稀疏矩阵是矩阵中大部分元素都是null0,只需要记录非0元素的位置就可以了,可以用一个三列的数组data[n][3]来记录。其中n是矩阵中非0(null)元素的个数+1+1是因为第一行需要记录矩阵的行列数和非0元素个数,这样才能在打印时确定矩阵的行列;其余行的前两列是元素在矩阵中对应的行列坐标,最后一列是坐标上的具体元素:SparseMatrix.java

对角矩阵

对角矩阵是只有主对角线上有非0(null)元素的矩阵,这就非常明显了,只需要记录对角线上的元素即可:DiagonalMatrix.java

矩阵的应用场景

图像处理方面用的很多,平时应用开发过程中用的不多,如果仅仅是存储数据,很多情况都可以简化为一维表,如果需要做矩阵相关的计算,才会使用到矩阵,目前没有特别使用过矩阵的场景。

广义表

如果表中的所有元素都是原子的、不可再分的非集合元素,这个表就是线性表;如果某个元素是一个可分的集合元素,那么这样的“线性表”成为广义表。

广义表由于元素在广度上的不确定性,就像是稀疏矩阵一样,如果使用数组存储,将浪费很多空间,所以一般都使用链式存储。

诸如树、图、散列等都是广义表,后面的数据结构都是对广义表的研究。

猜你喜欢

转载自blog.csdn.net/cl_yd/article/details/80327277