我的离散老师一直建议我们用矩阵来存储信息,尤其是两个事物的关系信息(比如两个元素相关联,比如图)
但如果要存储的关系是双向的,也就是无向图,那么用矩阵就会造成部分浪费,比如从a到b有路径,那么只需要在数组[a][b]位置置1即可,[b][a]再置1就显得浪费了
这种关系矩阵往往是对称矩阵所以需要
压缩存储
给相同元素只提供一个位置,以节约内存空间的占用问题
进一步来说,就是把重复的部分都去除,只保留有用信息
原始的存储结构应该是这样的
现在应该是
但是
如果还是用二维数组作为存储结构,其开辟的空间还是客观存在的,无法达到节约空间的目的
所以应该更改存储方式为—— 一维数组
也就是这样
如果是n行n列的二维数组(起始位置为1)存储到下标从0开始的数组中,那么就是:
其与数组中位置的对应关系
第i行j列元素为第 1+2+3+……+i-1+j 个,即 i*(i-1)/2+j
由于数组是从0开始计数,所以aij在数组 i*(i-1)/2+j-1 号位上(注意这里是逻辑二维矩阵映射到物理一维数组的公式)
比如i=6,j=4,那么就在第18号位上
如果是物理层面上的二维数组到一维数组
那么应该是 i*(i+1)/2+j
其转换代码为
#include<iostream>
using namespace std;
int main() {
int a[5][5] = {
{1,0,0,1,0},
{0,1,0,1,0},
{0,0,1,1,1},
{1,1,1,1,0},
{0,0,1,0,1}
};
int b[15];
for (int i = 0; i < 5; i++) {
for (int j = 0; j <= i; j++) {
b[i * (i + 1) / 2 + j] = a[i][j];
}
}
for (int i = 0; i < 15; i++) {
cout << b[i] << '\t';
}
}