对称矩阵压缩存储
‘壹’ 数据结构中对称矩阵的压缩存储的一 一对应关系怎么算的
先看上面一个:
下三角有i>=j
第1行一个,第2行两个,。。。,第i-1行i-1个(i, j下标都是从1开始的)
所以第i行前有1+2+...+(i-1)= i(i-1)/2个元素
再看本行,本元素前有j-1个元素
因为计算的是元素之间的位置差,因此就是i(i-1)/2+(j-1)了
下面一个上三角i<j:
对于对称矩阵有a(i,j)=a(j,i),即行列互换,代入上式即可得
‘贰’ 设有一个 10 × 10的对称矩阵 A采用压缩方式进行存储,存储时以按行优先的顺序
对称矩阵且存储的是下三角,那你首先得看a65是在下三角还是上三角,因为上三角的值是由下三角对称的值来存储的。6>5,a65在下三角。按行存储下三角,从第一行开始分别存储1,2,3,...个元素,a65表示第7行的第6个元素,那他前面的数据占的字节就是(1+2+3+4+5+6+5)*2=52,所以a65的地址是下一个53
‘叁’ 为什么对称矩阵可将n²个元素压缩存储到n(n+1)/2个元素的一维数组。而非存到n²/2一维数组
n×n阶对称矩阵中,对称轴上的元素是没有映像的,它们不重复。
对称轴一侧有n(n-1)/2个元素,对称轴上有n个元素,这是能够压缩的最低限数量,它们的和为:
n(n-1)/2+n=(n²-n+2n)/2=(n²+n)/2
=n(n+1)/2个。
而不是总用元素个数n²/2。
‘肆’ 一个8×8的对称矩阵,采用压缩存储需要几个对应的空间
一个8×8的对称矩阵,采用压缩存储需要
1+2+3+...+7+8=36
个对应的空间。
‘伍’ 设对称矩阵A压缩存储在一维数组B中
首先由 a52能够得到的信息有:
针对特殊的矩阵压缩的方式是存储下三角,而且下三角计算一维数组的下标是:k=i(i+1)/2+j
由a11 存储在B[0]可以知道 从1开始存储,计算时需要减1
a36位于上三角中,对应的下三角的点是a63,在根据公式就能算出下标,注意一定要找到下三角的点
‘陆’ 简单无向图的邻接矩阵是对称的,可以对其进行压缩存储
C
10*10的矩阵存储上三角,且对角线全为0,不用存储对角线的值,即可得:1. 第一行存9个数,第二行存8个,......,直到最后一行存0个,进行压缩存储。2. 上三角存储,即存储的数值均是行标小于列标,(V6,V3)存储的即为(V3,V6),它前面存入一维数组中的有9+8+2=19个(第一行9个,第二行8个,第三行从V3,V4开始存储到V3,V6有2个),从1开始,它就放在B【20】
‘柒’ 数据结构对称矩阵的压缩存储求数据地址
首先要先看看矩阵的行列表,有时会从1开始,但默认是从0开始
很显然,这里给出的是a[0][0]行列表就是从0开始的
所以a[3][6]就是第3行的第6个元素(这里的3和6指的是下标,实际上是第4行第6个元素)
因为a[3][6]是上三角的元素,所以转换成下三角就是a[6][3]
因为对称矩阵只需存储下三角或上三角
这里以下三角为例
第0行有1个元素,第1行有2个元素,第2行有3个元素.......
第6行第3列前有3个元素
所以Loc(a[3][6]) = Loc(a[6][3]) = Loc(a[0][0]) + ((1+6)*6/2+3)*2 = 1000 + 48 = 1048
计算上三角同理。
反正计算位置时要明白每一行的元素的个数
比如计算 上三角时第一行的元素个数就n个,n是矩阵的阶数,然后以下每行减1,最后用等差公式计算就行
公式的话书本上有,自己翻一下书吧。