特殊矩阵的压缩存储
Posted 薛定谔的猫ovo
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了特殊矩阵的压缩存储相关的知识,希望对你有一定的参考价值。
数组的存储结构
一个数组的所有元素在内存中是占用一段连续的存储空间的。
<1>一维数组
以一维数组
A
[
0...
n
−
1
]
A[0...n-1]
A[0...n−1]为例,其存储结构关系式为:
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(0≤i<n)
其中,
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)+[(i−l1)×(h2−l2+1)+(j−l2)]×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)+[(j−l2)×(h1−l1+1)+(i−l1)]×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 (1≤i,j≤n),则称其为对称矩阵。
对于 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数据结构-特殊矩阵的压缩存储