稀疏矩阵介绍

123 阅读1分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」第8天,点击查看活动详情 在日常的矩阵存储数据过程中,有可能矩阵中非零元素的个数远远大于为零的元素时,

我们的二维数组存储法空间利用率便显著下降,这时候的矩阵就叫做稀疏矩阵。

更正式来讲:当矩阵 m*n矩阵的非零元素个数为 cnt时,我们用 来表示矩阵的稀疏因子

如果这个因子<=0.5,那么我们就管这个矩阵叫稀疏矩阵

普遍来讲,稀疏矩阵都可以用三元组法来压缩,也就是把每个非零元素用三个属性表示装到一个格子里

然后整个稀疏矩阵就可以表示为这样的一个个格子组合而成的类似一维数组的东西。

i和j代表该元素在原来的稀疏矩阵中的横纵坐标,val是他们的值。

我们还可以根据此时稀疏矩阵的局部特征来进行合理的压缩,

如果此时 稀疏矩阵的Aij==Aji 那么我们可以将这个矩阵的上三角或者下三角舍去,只留下其中一个

舍去后得到的其中一个三角矩阵,我们将它压缩成一个一维数组,

压缩方法是:我们只需要让原来的二维数组下标 i,j 按照某个公式,组合重新算出新的一维数组下标k

这个公式可以保证每一个原来稀疏矩阵的元素都能在一维数组中有一个专属的位置。

而这个 (i,j)和k之间的关系公式就是

代码实现如下:

#include<iostream>
using namespace std;
int n, m,k;
int main() {
	cin >> n;
	int *arr = new int[n];
	int len = n * (n + 1) / 2;
	for (int i = 0; i < len; i++)
		cin >> arr[i];
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < n; j++) {
			if (i >= j)k = i * (i + 1) / 2 + j;
			else k = j * (j + 1) / 2 + i;
			printf("%d ", arr[k]);
		}printf("\n");
	}
	return 0;
}