特殊矩阵的压缩存储

Posted 薛定谔的猫ovo

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了特殊矩阵的压缩存储相关的知识,希望对你有一定的参考价值。


数组的存储结构

一个数组的所有元素在内存中是占用一段连续的存储空间的。

<1>一维数组

以一维数组 A [ 0... n − 1 ] A[0...n-1] A[0...n1]为例,其存储结构关系式为:
L O C ( a i ) = L O C ( a 0 ) + ( i ) × L ( 0 ≤ i < n ) LOC(a_i) = LOC(a_0)+(i)×L \\quad(0≤i<n) LOC(ai)=LOC(a0)+(i)×L(0in)
其中, L L L是每个数组元素所占的存储单元。

例如,对一个一维数组 A [ n ] A[n] A[n],其存储的首地址为100,每个元素占一个存储单元,求 A [ 14 ] A[14] A[14]的存储位置?
A [ 14 ] A[14] A[14]的存储位置为: 100 + 14 × 1 = 114 100+14×1 = 114 100+14×1=114

<2>多维数组

对于多维数组,有两种映射方法:按行优先按列优先

以二维数组为例,按行优先存储的基本思想是:先行后列。
先存储行号较小的元素,行号相等先存储列号较小的元素。
设二维数组行下标与列下标的范围分别为 [ l 1 , h 1 ] [l1,h1] [l1,h1] [ l 2 , h 2 ] [l2,h2] [l2,h2],则存储结构关系式为: L O C ( a i , j ) = L O C ( a l 1 , l 2 ) + [ ( i − l 1 ) × ( h 2 − l 2 + 1 ) + ( j − l 2 ) ] × L LOC(a_i,j) = LOC(a_l_1,l_2) + [(i-l_1)×(h_2-l_2+1) + (j-l_2)]×L LOC(ai,j)=LOC(al1,l2)+[(il1)×(h2l2+1)+(jl2)]×L
l 1 l_1 l1 l 2 l_2 l2 的值均为0 ,即从 A [ 0 ] [ 0 ] A[0][0] A[0][0]开始,上式变为
L O C ( a i , j ) = L O C ( a 0 , 0 ) + [ i × ( h 2 + 1 ) + j ) ] × L LOC(a_i,j) = LOC(a_0,0) + [i×(h_2+1) + j)]×L LOC(ai,j)=LOC(a0,0)+[i×(h2+1)+j)]×L

以二维数组为例,按列优先存储的基本思想是:先列后行。
先存储列号较小的元素,列号相等先存储行号较小的元素。
设二维数组行下标与列下标的范围分别为 [ l 1 , h 1 ] [l1,h1] [l1,h1] [ l 2 , h 2 ] [l2,h2] [l2,h2],则存储结构关系式为: L O C ( a i , j ) = L O C ( a l 1 , l 2 ) + [ ( j − l 2 ) × ( h 1 − l 1 + 1 ) + ( i − l 1 ) ] × L LOC(a_i,j) = LOC(a_l_1,l_2) + [(j-l_2)×(h_1-l_1+1) + (i-l_1)]×L LOC(ai,j)=LOC(al1,l2)+[(jl2)×(h1l1+1)+(il1)]×L
l 1 l_1 l1 l 2 l_2 l2 的值均为0 ,即从 A [ 0 ] [ 0 ] A[0][0] A[0][0]开始,上式变为
L O C ( a i , j ) = L O C ( a 0 , 0 ) + [ j × ( h 1 + 1 ) + i ) ] × L LOC(a_i,j) = LOC(a_0,0) + [j×(h_1+1) + i)]×L LOC(ai,j)=LOC(a0,0)+[j×(h1+1)+i)]×L


特殊矩阵的压缩存储

压缩存储:指为多个值相同的元素只分配一个存储空间,对零元素不分配存储空间。其目的是为了节省存储空间。

特殊矩阵:指具有许多相同矩阵元素或零元素,并且这些相同矩阵元素或零元素的分布有一定规律性的矩阵。常见的特殊矩阵有对称矩阵、上(下)三角矩阵、对角矩阵等。


对称矩阵

若对一个 n n n 阶方阵 A [ 1... n ] [ 1... n ] A[1...n][1...n] A[1...n][1...n]中的任意一个元素 a i , j a_i,j ai,j都有 a i , j a_i,j ai,j = a j , i   ( 1 ≤ i , j ≤ n ) a_j,i \\ (1≤i,j≤n) aj,i (1i,jn),则称其为对称矩阵

对于 n n n阶方阵,其中的元素可以划分为3个部分,即上三角区、主对角线和下三角区

对于 n n n阶对称矩阵,上三角区的所有元素和上三角区的对应元素相同,若仍采用二维数组存放,则会浪费几乎一半的空间,为此,将对称矩阵 A [ 1... n ] [ 1... n ] A[1...n][1...n] A[1...n][1...n]存放在一维数组 B [ n ( n + 1 ) / 2 ] B[n(n+1)/2] B[n(n+1)/2],即元素 a i , j a_i,j ai,j存放在 b k b_k bk中。只存放主对角线和下三角区(或上三角区)的元素,采用行优先存储

那么在数组B中,位于元素 a i , j ( i ≥ j ) a_i,j(i≥j) a数据结构-特殊矩阵的压缩存储

特殊矩阵的压缩存储

Java数据结构之对称矩阵的压缩算法---

特殊矩阵的压缩存储(转自chunlanse2014)

稀疏矩阵的压缩存储思想?

特殊矩阵的压缩存储(C语言)