【代码】稀疏矩阵的压缩存储与转置算法

#include<iostream>
#include<vector>
template <class T>
struct Triple
{
	T _value;
	size_t _row;
	size_t _col;
	Triple(const T& t =T(),size_t row = 0 ,size_t col = 0)
		:_value(t)
		, _row(row)
		, _col(col)
	{}

};
template <class T>
class SpareMatrix
{
public:
	SpareMatrix(T* a,size_t col,size_t row,const T invalid )
		:_row(row)
		, _col(col)
		, _invalid(invalid)
	{
		for (size_t i = 0; i < row; ++i)
		{
			for (size_t j = 0; j < col; ++j)
			{
				if (invalid != a[i*col + j])
					_array.push_back(Triple<T>(a[i*col + j], i, j));
			}
		}
	}
	SpareMatrix()
		:_row(0)
		, _col(0)
		, _invalid(0)
	{}
	SpareMatrix<T> Transport()
	{
		SpareMatrix<T> ret;

		for (size_t i = 0; i < _col; ++i)
		{
			size_t Index = 0;
			while (Index != _array.size())
			{
				if (_array[Index]._col == i)
				{
					Triple<T> temp(_array[Index]._value, _array[Index]._col, _array[Index]._row);
					ret._array.push_back(temp);
				}
				Index++;
			}
		}
		ret._col = _row;
		ret._row = _col;
		return ret;
	}
	SpareMatrix<T> QuickTransport()
	{
		int *RowCounts = new int [_col];
		int *RowStarts = new int [_col];
		memset(RowCounts, 0, sizeof(int)*_col);
		memset(RowStarts, 0, sizeof(int)*_col);
		SpareMatrix<T>ret;
		ret._array.resize(_array.size());
		size_t index = 0;
		while (index < _array.size())
		{
			RowCounts[_array[index++]._col]++;
		}
		index = 1;
		RowStarts[0] = 0;
		while (index < _col)
		{
			RowStarts[index] = RowCounts[index - 1] + RowStarts[index++ - 1];
		}
		index = 0;
		while (index < _array.size())
		{
			int &RowStart = RowStarts[_array[index]._col];
			Triple<T>tmp(_array[index]._value, _array[index]._col, _array[index]._row);
			ret._array[RowStart++] = tmp;
			index++;
		}
		ret._col = _row;
		ret._row = _col;
		ret._invalid = _invalid;
		return ret;
	}
	void Print()
	{
		size_t index = 0;
		for (size_t i = 0; i < _row; ++i)
		{
			for (size_t j = 0; j < _col; ++j)
			{
				if (index < _array.size() && _array[index]._col == j)
				{
					cout << _array[index++]._value << " ";
				}
				else
					cout << _invalid << " ";
			}
			cout << endl;
		}
		cout << endl;
	}
protected:
	size_t _row;
	size_t _col;
	T _invalid;
	std::vector<Triple<T>> _array;
};
时间: 2024-11-02 23:33:11

【代码】稀疏矩阵的压缩存储与转置算法的相关文章

稀疏矩阵的压缩存储及转置算法

矩阵(Matrix)是一个按照长方阵列排列的复数或实数集合. 稀疏矩阵:有效数据远少于无效数据. eg:规定无效数据为 0 1 0 0 0 0 0 0 0 0 2 0 3 0 0 0 4 0 0 0 0 上述矩阵则可称为一个稀疏矩阵 我们在学习C语言的时候已经见过并使用过矩阵,其实它在我们的编程语言里可以翻译成二维数组,由于稀疏矩阵的有效数据十分的少,完全存储十分耗费我们的空间,所以我们选择只存储它的有效数据位,所以我们可以直接使用一维数组将其存储起来,但是我们必须让别人在看它时还能知道它是一个

C++实现稀疏矩阵的压缩存储、转置、快速转置

/*稀疏矩阵的压缩存储.转置.快速转置*/ #include <iostream> using namespace std; #include <vector> //三元组 template<class T> struct Triple { size_t _row; size_t _col; T _value; Triple(size_t row = 0, size_t col = 0, const T& value = T()) :_row(row) ,_co

稀疏矩阵的压缩存储及转置

没有经过处理的稀疏矩阵其实就是一个特殊的二维数组,数组中的大部分元素是0或者其他类型的非法值,只有少数几个非零元素. 为了实现压缩存储,可以只存储稀疏矩阵的非0元素.在存储稀疏矩阵中的非0元素时,必须要存储该元素的行列号以及元素值.我们可以封装一个三元组类来存储这些元素. //三元组 template<class T> struct Triple { size_t _row;   //行 size_t _col;   //列 T _value;      //值 Triple<T>

稀疏矩阵的压缩存储和转置

1.稀疏矩阵:M*N的矩阵,矩阵中有效值的个数远小于无效值的个数,且这些数据的分布没有规律. 2.稀疏矩阵的压缩存储:压缩存储值存储极少数的有效数据. 由于非零元素分布没有任何规律,所以在进行压缩存储的时侯需要存储无效值的同时还要存储有效元素在矩阵中的位置,即有效元素所在的行号和列号,也就是在存储某个元素比如aij的值的同时,还需要存储该元素所在的行号i和它的列号j,这样就构成了一个三元组(i,j,aij)的线性表. 使用{ row, col, value }三元组存储每一个有效数据,三元组按原

稀疏矩阵的压缩存储与转置

稀疏矩阵:矩阵中大多数元素为0的矩阵(本文以行序为主序) 稀疏矩阵的三元组表述法: 类型结构: template <typename T> struct Triple { int _row; int _col; T _value; }; template <typename T> class SparseMatrix { public: SparseMatrix<T>::SparseMatrix(); SparseMatrix(const T* array, size_

c++:稀疏矩阵的压缩存储及转置

SparseMatrix.hpp #pragma once #include<iostream> using namespace std; #include<vector> template<class T> struct Triple{  T _value;  size_t _row;  size_t _col; }; #define ROW 6 #define COL 5 template<class T> class SparseMatrix{ pub

稀疏矩阵-压缩存储-列转置法- 一次定位快速转置法

稀疏矩阵的压缩存储 压缩存储值存储极少数的有效数据.使用{row,col,value}三元组存储每一个有效数据,三元组按原矩阵中的位置,以行优先级先后顺序依次存放. 压缩存储:行优先一行一行扫 有效数据存入以为矩阵_arr 列转置法 : 从前向后遍历压缩矩阵,先找列号为0的存入 转置矩阵的压缩矩阵.然后从前向后找列号为1的 ...直到转置矩阵的压缩矩阵大小和 原矩阵的一样大 这时就找完了 时间复杂度为    O(原矩阵列数 * 压缩矩阵长度) 一次定位快速转置法: 设置两个辅助矩阵 RowCou

对称矩阵、稀疏矩阵的压缩存储

1)对称矩阵的压缩存储 对称矩阵顾名思义就是符合行和列的个数相同,并且矩阵中存储的数据上三角和下三角中对应位置上的元素值是相等的.为了能够减少存储的空间,我们可以只存储上三角矩阵.或者下三角矩阵中的元素,这样就能够极大地节省空间的浪费.下面是对称矩阵的示列: 假设对称矩阵为n*n,这里以行优先存储下三角矩阵,总共需要存储的元素有n*(n+1)/2个元素,从而将n*n个元素压缩到n*(n+1)/2大小的空间中. 下面是具体的程序实现: --symmetric.h文件 //实现对称矩阵 #inclu

c++稀疏矩阵的压缩存储

稀疏矩阵 M*N的矩阵 其中有效值的个数远小于无效值的个数 且分布没有规律 Eg: int array [6][5] =     {{1, 0, 3, 0, 5}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}, {2, 0, 4, 0, 6}, {0, 0, 0, 0, 0}, {0, 0, 0, 0, 0}}; 稀疏矩阵的压缩存储 压缩存储值存储极少数的有效数据.使用{row,col,value}//行 列 值三元组存储每一个有效 数据,三元组按原矩阵中的位置,以行优先级