概述

矩阵是很多工程领域都需要的数学对象,在数据结构中主要讨论的是如何高效的存储矩阵的(即矩阵中的元素)。

比如在矩阵的实际应用中,经常出现很多高阶矩阵存在很多相同元素或是0,为了节省空间就可以对其进行压缩,即多元素共享一个存储单元、不对0分配存储单元等。

假如值相同的元素或者零元素在矩阵中分布有一定规律,则称此类矩阵为特殊矩阵;反之则成为稀疏矩阵。下面分别看一下它们如何实现压缩存储。

特殊矩阵

nn阶矩阵AA中的元满足性质:aij=aji1(i,j)na_{ij} = a_{ji} \quad | \quad 1\leq (i, j) \leq n,则称为nn对称矩阵

对于对称矩阵而言,可以为每一对对称元只分配一个存储空间,这样一来n2n^2个元就被压缩成了n(n+1)/2n(n+1) /2个元的空间中。

我们可以以行序为主序存储其下三角(包括对角线)的元。假设以一维数组sa[n(n+1)/2]sa[n(n+1)/2]作为nn阶对称矩阵AA的存储结构,则sa[k]sa[k]和矩阵元aija_{ij}之间存着一一对应关系:
k={i(i1)2+j1ijj(j1)2+i1i<j k = \begin{cases} \frac{i(i-1)}{2}+j-1 \quad |& i \geq j\\ \frac{j(j-1)}{2}+i-1 \quad |& i < j \end{cases}
对于任意给定的下标(i,j),均可在sasa中找到矩阵元aija_{ij}。反之,对所有的k=0,1,2,,n(n+1)21k=0,1,2, \dots, \frac{n(n+1)}{2}-1 ,都能确定sa[k]sa[k]中的元位于矩阵中的(i,j)sa[n(n+1)/2]sa[n(n+1)/2]可以称为nn阶对称矩阵AA的压缩存储。这种存储方法同样可以用于三角矩阵。

稀疏矩阵

稀疏矩阵没有精确的定义,但有一个数值可以计算:

设在m×nm \times n的矩阵中有tt个元素不为零,定δ=tmn\delta = \frac{t}{mn},称δ\delta为矩阵的稀疏因子,通常认为δ0.05\delta \leq 0.05时为稀疏矩阵。

对于稀疏矩阵,存储有不同的方式,可以采用三元组(i,j,aiji, j, a_{ij})顺序存储或是十字链表等方式。

三元组是用矩阵坐标及该位置元素存储的,即每个三元组对应矩阵中的一个元。有矩阵M如下:
M=[01290000000003000014002400001800001500700] M= \begin {bmatrix} 0& 12& 9& 0& 0& 0\\ 0& 0& 0& 0& 0& 0\\ -3& 0& 0& 0& 0& 14\\ 0& 0& 24& 0& 0& 0\\ 0& 18& 0& 0& 0& 0\\ 15& 0& 0& -7& 0& 0 \end {bmatrix}
则其对应的三元组即为[(1,2,12),(1,3,12),(3,1,3),(3,6,14),(4,3,24),(5,2,18),(6,1,15),(6,4,7)][(1,2, 12), (1,3, 12), (3,1, -3), (3,6, 14), (4,3, 24), (5,2, 18), (6,1, 15), (6,4, -7)]

三元组的缺点在于当矩阵元插入时,可能需要大量的移动操作,因此也有十字链表的方式存储,这样一来就可以避免操作时需要耗费大量时间来移动三元组了,如下图:

数据结构 矩阵基础

图片来自互联网

相关文章:

  • 2021-08-29
  • 2021-11-16
  • 2021-06-21
  • 2021-05-29
  • 2021-04-24
  • 2022-01-10
猜你喜欢
  • 2021-12-19
  • 2022-02-06
  • 2021-07-29
  • 2021-12-17
  • 2021-12-19
  • 2022-12-23
相关资源
相似解决方案