数据结构–特殊矩阵的压缩存储
![](https://i-blog.csdnimg.cn/blog_migrate/a19bd909b98b7b689e7c20d70f7ab07c.png)
一维数组的存储结构
ElemType a[10]; //ElemType型一维数组
![](https://i-blog.csdnimg.cn/blog_migrate/55429e0f46035ade0fc600f6f8cb4a69.png)
各数组元素大小相同,且物理上连续存放。
数组元素a[i]的存放地址= LOC + i * sizeof(ElemType)
(
0
≤
i
<
10
)
(0\le i < 10)
(0≤i<10)
注:除非题目特别说明,否则数组
下标默认从
0
开始
\color{red}下标默认从0开始
下标默认从0开始
注意审题
!
易错
!
\color{purple}注意审题!易错!
注意审题!易错!
二维数组的存储结构
ElemType b[2][4];//2行4列的二维数组
逻辑视角 : 逻辑视角: 逻辑视角:
![](https://i-blog.csdnimg.cn/blog_migrate/330a50e7df33552b9852f78f0f17c4f5.png)
内存视角: 内存视角: 内存视角:
![](https://i-blog.csdnimg.cn/blog_migrate/979c6550a77279f534defe9ed05fed6a.png)
行优先存储
![](https://i-blog.csdnimg.cn/blog_migrate/7510d84641d3568d85407038f9efaa23.png)
M行N列的二维数组b[M][N]中,若按行优先存储,则b[i][i]的存储地址= LOC+( i * N + j) * sizeof(ElemType)
列优先存储
![](https://i-blog.csdnimg.cn/blog_migrate/00abcc4936bc124cb54aef97bb759c06.png)
M行N列的二维数组b[M][N]中,若按列优先存储,则b[i][li]的存储地址= LOC+( j * M+ i ) * sizeof(ElemType)
普通矩阵的存储
![](https://i-blog.csdnimg.cn/blog_migrate/bcd66be5b4c053ab6940eff2bad4334e.png)
可用二维数组存储 \color{red}可用二维数组存储 可用二维数组存储
注意:描述矩阵元素时,行、列号通常从1开始;而描述数组时通常下标从0开始
(具体看题目给的条件,注意审题!)
特殊矩阵的存储
![](https://i-blog.csdnimg.cn/blog_migrate/c76cb41ccacedfa2d0fa1040a0f15741.png)
某些特殊矩阵可以压缩存储空间 \color{red}某些特殊矩阵可以压缩存储空间 某些特殊矩阵可以压缩存储空间
对称矩阵的压缩存储
![](https://i-blog.csdnimg.cn/blog_migrate/685479b39c3af6190025638abd1e85f4.png)
若
n
n
n 阶
方阵
\color{green}方阵
方阵中任意一个元素
a
i
,
j
\color{green}{a_{i,j}}
ai,j ,都有
a
i
,
j
=
a
j
,
i
\color{green}{a_{i,j} = a_{j,i}}
ai,j=aj,i 则该矩阵为对称矩阵
普通存储:
n
∗
n
n*n
n∗n 二维数组
压缩存储策略:只存储主对角线+下三角区(或主对角线+上三角区)
![](https://i-blog.csdnimg.cn/blog_migrate/e5dfe0b2a09dc8c5c88c70c9fc0dca7a.png)
策略
\color{purple}策略
策略:只存储主对角线+下三角区
按
行优先
\color{red}行优先
行优先原则将各元素存入一维数组中。
![](https://i-blog.csdnimg.cn/blog_migrate/fcc8408364e834c187f9add9f2d3e157.png)
思考:
①数组大小应为多少?
②站在程序员的角度,对称矩阵压缩存储后怎样才能方便使用?
回答:
①(1+n)*n/2
②可以实现一个“映射”函数:矩阵下标→一维数组下标
![](https://i-blog.csdnimg.cn/blog_migrate/cf5f053f1c4efffc3e999b6491b70c92.png)
K e y \color{red}Key Key:按 行优先 \color{green}行优先 行优先的原则, a i , j a_{i,j} ai,j 是第几个元素?
![](https://i-blog.csdnimg.cn/blog_migrate/153c5a2e97d90f5f909872c85247c6e7.png)
![](https://i-blog.csdnimg.cn/blog_migrate/8b7d3ebbb8dbd3caf01e46e497f81b83.png)
![](https://i-blog.csdnimg.cn/blog_migrate/af28241f371c41d739957609cb7ce334.png)
三角矩阵的压缩存储
下三角矩阵:除了主对角线和下三角区,其余的元素都相同
![](https://i-blog.csdnimg.cn/blog_migrate/84a0b5a0c5545b4687c74d7e152c7124.png)
上三角矩阵:除了主对角线和上三角区,其余的元素都相同
![](https://i-blog.csdnimg.cn/blog_migrate/fee6bce94d973fa4d0d2a6e580fea6b3.png)
下三角矩阵
压缩存储策略:按 行优先 \color{red}行优先 行优先原则将橙色区元素存入一维数组中。并 在最后一个位置存储常量 c \color{red}在最后一个位置存储常量c 在最后一个位置存储常量c
![](https://i-blog.csdnimg.cn/blog_migrate/55a045ca3bba2483e5c7a24b2914b44c.png)
![](https://i-blog.csdnimg.cn/blog_migrate/b115b90042534db7bbddce16149f8f6b.png)
K e y \color{red}Key Key:按 行优先 \color{red}行优先 行优先的原则, a i , j a_{}i,j ai,j是第几个元素?
![](https://i-blog.csdnimg.cn/blog_migrate/cb03ed5e45827a8f014b31011059d806.png)
上三角矩阵
压缩存储策略:按 行优先 \color{red}行优先 行优先原则将绿色区元素存入一维数组中。并 在最后一个位置存储常量 c \color{red}在最后一个位置存储常量c 在最后一个位置存储常量c
![](https://i-blog.csdnimg.cn/blog_migrate/6cf22d4af18a003cd9dab9db112c2b29.png)
![](https://i-blog.csdnimg.cn/blog_migrate/ce01e975309f74665d730017134eba1c.png)
K e y \color{red}Key Key:按 行优先 \color{red}行优先 行优先的原则, a i , j a_{i,j} ai,j是第几个元素?
![](https://i-blog.csdnimg.cn/blog_migrate/209a8fc717e2908b8e42a35968443223.png)
三对角矩阵的压缩存储
三对角矩阵
三对角矩阵
三对角矩阵,又称
带状矩阵
带状矩阵
带状矩阵:
当
∣
i
−
j
∣
>
1
|i-j|>1
∣i−j∣>1时,有
a
i
,
j
=
0
(
1
≤
i
,
j
≤
n
)
a_{i,j}=0 ( 1 \le i, j ≤ n)
ai,j=0(1≤i,j≤n)
![](https://i-blog.csdnimg.cn/blog_migrate/10cfe0e608c721991d212c96ca13d3c0.png)
压缩存储策略
:
\color{black}压缩存储策略:
压缩存储策略:
按
行优先
\color{red}行优先
行优先(或列优先)原则,只存储带状部分
![](https://i-blog.csdnimg.cn/blog_migrate/3ccf9d38659fa7636a61cee2ce876486.png)
![](https://i-blog.csdnimg.cn/blog_migrate/0533dca3b21526217085de1697075ab4.png)
K e y \color{red}Key Key:按 行优先 \color{red}行优先 行优先的原则, a i , j a_{i,j} ai,j是第几个元素?
![](https://i-blog.csdnimg.cn/blog_migrate/f54b6e76a3d17c02bc6b97267fe3a962.png)
若已知数组下标k,如何得到i, j?
B
[
k
]
→
a
i
,
j
B[k] \to a_{i,j}
B[k]→ai,j
第k+1个元素,在第几行?第几列?
前
i
−
1
i-1
i−1 行共
3
(
i
−
1
)
−
1
3(i-1)-1
3(i−1)−1 个元素
前
i
i
i 行共
3
i
−
1
3i-1
3i−1 个元素
显然,
3
(
i
−
1
)
−
1
<
k
+
1
≤
3
i
−
1
3(i-1)-1<k+1 ≤ 3i-1
3(i−1)−1<k+1≤3i−1
i
≥
(
k
+
2
)
/
3
i ≥ (k+2)/3
i≥(k+2)/3
可以理解为“刚好”大于等于
$i =
⌈
k
+
2
3
⌉
\left\lceil\dfrac{k+2}{3}\right\rceil
⌈3k+2⌉
向上取整即可满足“刚好”大于等于
![](https://i-blog.csdnimg.cn/blog_migrate/4e5c1e60a841f315c5be9c4084986494.png)
第k+1个元素,在第几行?第几列?
i =
⌈
(
k
+
2
)
/
3
⌉
\left\lceil(k+2)/3\right\rceil
⌈(k+2)/3⌉
或
i =
⌊
(
k
+
1
)
/
3
+
1
⌋
\left\lfloor(k+1)/3+1\right\rfloor
⌊(k+1)/3+1⌋
由 k = 2 i + j − 3 k = 2i+j-3 k=2i+j−3,得 j = k − 2 i + 3 j = k- 2i+ 3 j=k−2i+3
稀疏矩阵的压缩存储
稀疏矩阵 \color{red}稀疏矩阵 稀疏矩阵:非零元素远远少于矩阵元素的个数
![](https://i-blog.csdnimg.cn/blog_migrate/040c0b8670ff51fc31db843361e4b2d7.png)
压缩存储策略:
顺序存储 ―― 三元组<行,列,值>
![](https://i-blog.csdnimg.cn/blog_migrate/27ae1d105760675a973ffbfa57c18542.png)
压缩存储策略二:
链式存储――
十字链表法
\color{red}十字链表法
十字链表法
![](https://i-blog.csdnimg.cn/blog_migrate/fdf3b52c3ada39e63862486e05adc93f.png)
![](https://i-blog.csdnimg.cn/blog_migrate/3751179c95cacefa2fb85d5a2f60dd26.png)
知识点回顾与重要考点
![](https://i-blog.csdnimg.cn/blog_migrate/56341506e8fc656e99b185f76b72a5d4.png)
![](https://i-blog.csdnimg.cn/blog_migrate/507e738397361af683ec45037e44bea1.png)