数据结构::矩阵(一)--对称矩阵及对称矩阵的压缩存储
2016-12-12 18:38
267 查看
【对称矩阵】:
1、定义:元素以对角线为对称轴对应相等的矩阵。
设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0
<= i <= N-1
&& 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三
角和下三角。
【对称矩阵的压缩存储】:
1、压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存
储n(n+1)/2个数据。
2、对称矩阵和压缩存储的对应关系:下三角存储i>=j,
SymmetricMatrix[i][j] ==
Array[i*(i+1)/2+j]
**下面给出对称矩阵的实现代码**:
#include<iostream>
using namespace std;
template<typename T>
class SymmetricMatrix
{
public:
//构造函数
SymmetricMatrix()
{}
SymmetricMatrix(T* a, size_t n)
:_a(new T[n*(n+1)/2])
,_n(n)
{
size_t index = 0;
for(size_t i= 0; i<_n; i++)
{
for(size_t j = 0; j<_n; j++)
{
if(i >= j)
{
_a[index] = a[i*n+j];
index++;
}
else
{
break;
}
}
}
}
//析构函数
~SymmetricMatrix()
{
if(_a)
{
delete[]_a;
}
}
//判断数组是否是访问下三角的
T& Access(size_t i,size_t j)
{
if(i <= j)
{
std::swap(i,j);
}
return _a[i*(i+1)/2+j];
}
//打印对称矩阵
void Print()
{
for(size_t i = 0; i<_n; i++)
{
for(size_t j = 0; j<_n; j++)
{
cout<<Access(i,j)<<" ";
}
cout<<endl;
}
cout<<endl;
}
protected:
T* _a; //用二维数组存储,用一维数组进行读取
size_t _n; //因为是n*n的,直接给n就可以了
};
void Test()
{
int a [5][5]=
{
{0,1,2,3,4},
{1,0,1,2,3},
{2,1,0,1,2},
{3,2,1,0,1},
{4,3,2,1,0},
};
SymmetricMatrix<int> sm((int*)a,5);
sm.Print();
}
int main()
{
Test();
return 0;
}
1、定义:元素以对角线为对称轴对应相等的矩阵。
设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0
<= i <= N-1
&& 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上三
角和下三角。
【对称矩阵的压缩存储】:
1、压缩存储称矩阵存储时只需要存储上三角/下三角的数据,所以最多存
储n(n+1)/2个数据。
2、对称矩阵和压缩存储的对应关系:下三角存储i>=j,
SymmetricMatrix[i][j] ==
Array[i*(i+1)/2+j]
**下面给出对称矩阵的实现代码**:
#include<iostream>
using namespace std;
template<typename T>
class SymmetricMatrix
{
public:
//构造函数
SymmetricMatrix()
{}
SymmetricMatrix(T* a, size_t n)
:_a(new T[n*(n+1)/2])
,_n(n)
{
size_t index = 0;
for(size_t i= 0; i<_n; i++)
{
for(size_t j = 0; j<_n; j++)
{
if(i >= j)
{
_a[index] = a[i*n+j];
index++;
}
else
{
break;
}
}
}
}
//析构函数
~SymmetricMatrix()
{
if(_a)
{
delete[]_a;
}
}
//判断数组是否是访问下三角的
T& Access(size_t i,size_t j)
{
if(i <= j)
{
std::swap(i,j);
}
return _a[i*(i+1)/2+j];
}
//打印对称矩阵
void Print()
{
for(size_t i = 0; i<_n; i++)
{
for(size_t j = 0; j<_n; j++)
{
cout<<Access(i,j)<<" ";
}
cout<<endl;
}
cout<<endl;
}
protected:
T* _a; //用二维数组存储,用一维数组进行读取
size_t _n; //因为是n*n的,直接给n就可以了
};
void Test()
{
int a [5][5]=
{
{0,1,2,3,4},
{1,0,1,2,3},
{2,1,0,1,2},
{3,2,1,0,1},
{4,3,2,1,0},
};
SymmetricMatrix<int> sm((int*)a,5);
sm.Print();
}
int main()
{
Test();
return 0;
}
相关文章推荐
- sdut 2118-数据结构实验之链表三:链表的逆置
- sdut 2117 -数据结构实验之链表二:逆序建立链表
- 排序算法-希尔排序
- 排序算法-插入排序
- 排序算法-选择排序
- sdut 2116—数据结构实验之链表一:顺序建立链表
- 数据结构实验之排序五:归并求逆序数
- js 数据结构与算法 更新ing
- 模拟哈希(开放地址法)
- 古老的火车问题
- 数据结构期末总结
- Java数据结构和算法-链表(3-有序链表)
- 动态树 LCT(Link-Cut-Tree)--入门教程
- 数据结构之图(存储结构、遍历)
- java数据结构与算法之递归思维(让我们更通俗地理解递归)
- 数据结构——哈希表
- kdtree&knn
- BZOJ 1146 二分+链剖+线段树+treap
- 数据结构——二叉树
- 算法与数据结构(十四) 堆排序 (Swift 3.0版)