数组9——数组的压缩存储1——基本内容

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/baidu_36669549/article/details/85017010

【压缩存储】

有些高阶矩阵中,非零的元素非常少,此时若使用二维数组将造成存储空间的浪费,这时,可只存储部分元素,从而提高存储空间的利用率。通常的做法是为多个相同值的元素只分配一个存储单元,对值为零的元素不分配存储单元。这种存储方式称为矩阵的压缩存储。我们把非零元素非常少(远小于m×n)或元素分布呈一定规律的矩阵称为特殊矩阵。对称矩阵、三角矩阵和对角矩阵都属于特殊矩阵。


【对称矩阵】

如果一个n阶矩阵A的元素满足性质

aij=aji

则称这种矩阵为n阶对称矩阵,每一对对称元素值相等,我们只需为每一对对称元素分配一个存储空间这样既可将n×n个元素存储在n(n+1)/2的存储单元里。一个n阶的对称矩阵A

如图所示


假设用一维数组s存储对称矩阵A的上三角元素或下三角元素,则一维数组s的下标k与n阶对称矩阵A的元素aij之间的关系为:

当i≥j,矩阵A以下三角形式存储,i*(i+1)/2+j为矩阵A中的元素的线性排序编号;

当i<j,矩阵A以上三角形式存储,j*(j+1)/2+i为矩阵A中的元素的线性排序编号。任意给定一组下标(i,j)就可以确定矩阵A在一维数组s中的存储位置。我们将s称为n阶对角矩阵A的压缩存储。


【三角矩阵】

三角矩阵分为两种:上三角矩阵和下三角矩阵。其中,下三角元素均为常数c或零的n阶矩阵称为上三角矩阵,上三角元素均为常数c或者零的n阶矩阵称为下三角矩阵。n×n的上三角矩阵和下三角矩阵

如图所示

上三角矩阵的压缩原则是只存储上三角元素,不存储下三角的零元素(或只用一个存储单元存储下三角的非零元素)。下三角矩阵的存储单元存储元素与此类似。如果用一维数组来存储三角矩阵,则需要n*(n+1)/2+1个元素,一维数组的下标k与矩阵的下标(i,j)的对应关系为:

公式:


公式:

其中,第k=n*(n+1)个位置存放的是常数c或者零元素。上述公式可根据等差数列推导得出。

【对角矩阵】

对角矩阵(也称为带状矩阵)是另一类特殊矩阵。所谓对角矩阵,就是所有的非零元素都集中在以主对角线为中心的带状区域内(对角线的个数为奇数)。也就是说,除了主对角线和主对角线上、下若干条对角线上的元素外,其他元素的值均为零。一个3对角矩阵

如图所示。

通过观察,我们发现以上对角矩阵具有以下特点:

当i=0,j=1,2时,即第一行有两个非零元素;
当0<i<n-1,j=i-1,i,i=1时,即第二行到第n-1行之间有三个非零元素;当i=n-1,j=n-2,n-1时,即最后一行有两个非零元素。除此之外,其他元素均为零。


除了第一行和最后一行非零元素为2个,其余各行非零元素为3个,因此若用一维数组存储这些非零严肃,需要2+3*(n-2)+2=3n-2个存储单元。

下面来确定一维数组的下标k与矩阵的下标(i,j)之间的关系。先确定下标为(i,j)的元素与第1个元素之间在一维数组中的关系,用Loc(i,j)表示aij在一维数组中的位置,Loc(0,0)表示第一个元素在一维数组中的地址。

Loc(i,j)=Loc(0,0)+前i-1行的非零元素个数+第i行的非零元素个数,其中,前i-1行的非零元素个数为3*(i-1)-1,第i行的非零元素个数为j-i+1。其中

公式。

猜你喜欢

转载自blog.csdn.net/baidu_36669549/article/details/85017010
今日推荐