数据结构:矩阵的压缩存储(特殊矩阵)

//                    对称矩阵的压缩存储
/*
        满足a[i][j] = a[j][i]  0 <= i,j <= n-1,则称为对称矩阵
        对于对称矩阵,我们可以为每一对对称元分配一个存储空间,则可将n^2个元压缩
成n(n+1)/2个元的空间中。不失一般性,我们可以以行序为主序存储其下三角(包
括对角线)中的元。
        假设以一维数组sa[n(n+1)/2]作为n阶对称矩阵A的存储结构,则sa[k]和矩阵元a[i][j]
之间存在着一一对应关系:
        当i >= j 时,k = 1+2+...+i+j = (1+i)*i/2 + j;
        当i <  j 时,k = 1+2+...+j+i = (1+j)*j/2 + i;
*/

 
#include <iostream>
#include <cassert>
using namespace std;
typedef int ElemType;
#define MAX_ROW 20
#define MAX_COL 20
//typedef SymMat[MAX_ROW][MAX_COL];
typedef struct  
{
	int rows; //行数
	int cols; //列数
			  //对称矩阵行列数一样
	ElemType* base;
}SymMat;
//创建对称矩阵,进行了压缩存储的
//rows与cols是相等的,但为了保持矩阵下标的完整性,故一起写上吧
void CreateSymMat( SymMat& M, int rows, int cols )
{
	assert( rows > 0 && cols > 0 && rows == cols );
	if ( rows <= 0 || cols <= 0 || rows != cols )
		return;
	M.rows = rows;
	M.cols = cols;
	M.base = new ElemType[ (1+M.cols)*M.cols/2 ];
	assert( M.base );
	if ( !M.base )
		exit( -2 );
	//memset( M.base, 0, (1+M.cols)*M.cols/2 );
	for( int i = 0; i < (1+M.cols)*M.cols/2; ++i )
		*(M.base + i) = 0;
	
}

void DestroySymMat( SymMat& M )
{
	if ( !M.base )
		return;
	delete[] M.base;
	M.base = NULL;
}

ElemType& Value( SymMat& M, int row, int col )
{
	assert( row > 0 && row < M.rows && col > 0 && col < M.cols );
	int k = 0;
	if ( row >= col )
	{
		 k = (1+row)*row/2 + col;
	}
	else
	{
		 k = (1+col)*col/2 + row;
	}
	return *(M.base+k);
	
}

int main( int argc, char** argv )
{
	SymMat M;
	CreateSymMat( M, 13, 13 );
	cout << Value( M, 1, 2 ) << endl;
	Value( M, 1, 2 ) = 123;
	cout << Value( M, 1, 2) << endl;

	DestroySymMat( M );
	return 0;
}

//shan quan liang 2014.1.1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值