稀疏矩阵的压缩存储
压缩存储值存储极少数的有效数据。使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放。
压缩存储:行优先一行一行扫 有效数据存入以为矩阵_arr
列转置法 : 从前向后遍历压缩矩阵,先找列号为0的存入 转置矩阵的压缩矩阵.然后从前向后找列号为1的 。。。直到转置矩阵的压缩矩阵大小和 原矩阵的一样大 这时就找完了
时间复杂度为 O(原矩阵列数 * 压缩矩阵长度)
一次定位快速转置法:
RowCounts 记录 原矩阵每列的有效元素元素的个数 (这里Row指的是转置矩阵的行 RowCount指的也就是转置矩阵 的 行有效元个数)
RowStart 记录的是 原矩阵 每列首个有效元素 在 转置矩阵 的压缩矩阵中的坐标 (也就是 转置矩阵 的 每行首个有效元素 在 转置矩阵 的压缩矩阵中的 坐标)
RowStart[n]可以由 RowCount[n-1]和上一个RowStart[n-1]求得 n>0
RowStart[0] = 0;
利用 RowStart 可以实现 由 原矩阵 的压缩矩阵元素 到 转置矩阵的压缩矩阵 的一次快速定位
如:
#define _CRT_SECURE_NO_WARNINGS 1
#include <iostream>
#include <assert.h>
#include <vector>
#include <string>
using namespace std;
/***
*
*稀疏矩阵
*压缩存储
*转置 (一般 和 快速转置)
*2016-4-18
*bozi
******************/
//三元组
template<class T>
struct Triple
{
size_t _row;
size_t _col;
T _value;
Triple()
{}
Triple(size_t row, size_t col, T value)
:_row(row)
,_col(col)
,_value(value)
{}
};
//稀疏矩阵
template<class T>
class SparesMatrix
{
public:
SparesMatrix();