对称矩阵的压缩存储
来源:互联网 发布:广联达软件下载教程 编辑:程序博客网 时间:2024/05/21 10:09
首先来看什么是对称矩阵:
设一个N*N的方阵A,A中任意元素Aij,当且仅当Aij == Aji(0 <= i <= N-1& 0 <= j <= N-1),则矩阵A是对称矩阵。以矩阵的对角线为分隔,分为上角和下三角。
压缩存储指的是:矩阵存储时只需要存储上三角/下三角的数据,所以最多存储n(n+1)/2个数据。
对称矩阵和压缩存储的对应关系:下三角存储i>=j, SymmetricMatrix[i][j] ==arry[i*(i+1)/2+j]
比如下面的例子:
可以看到上三角和下三角数据相同,那么我们存储时只需存储一个三角的数据就可以,很好的节省了空间。
代码实现部分:
//头文件#pragma once#include<iostream>using namespace std;#include<vector>template<typename T>class SymmetricMatrix{public:SymmetricMatrix(T* a,size_t n):_a(new T[n*(n+1)/2]),_n(n){size_t idx = 0;for (size_t i = 0; i < n; i++){for (size_t j = 0; j < n; j++){if (i >= j){_a[idx++] = a[i*n+j];}else{break;}}}}T& Access(size_t i, size_t j){if (i <j){swap(i, j);}return _a[(i*(i + 1)) / 2 + j];}void Display (){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;};
//测试部分#include"Matrix.h"void TestMatrix(){int arr[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*)arr, 5);sm.Display();}int main(){TestMatrix();system("pause");}
这里说一下最关键的部分思路:我这里采用的是下三角存储,所以开辟空间时只需要new T [n*(n+1)/2] 就可以,以一维数组的方式存储,比如_a[0]=0,_a[1]=1,_a[2]=0,_a[3]=2,_a[4]=1,_a[5]=0以此类推,所以实际上开辟的一位数组里边一共存储了15个元素。再来看打印函数,怎么把所有的元素打印出来呢?两个for循环遍历二维数组的所有元素时,当遍历到右上角元素时,可以把横坐标和纵坐标交换,转为对应左下角的元素,再输出
运行结果: 1 0
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- ~对称矩阵的压缩存储~
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵的压缩存储
- 对称矩阵、稀疏矩阵的压缩存储
- 对称矩阵压缩存储
- 对称矩阵压缩存储
- 对称矩阵 压缩存储
- 对称矩阵压缩存储
- 对称矩阵及对称矩阵的压缩存储
- 【数据结构】对称矩阵及对称矩阵的压缩存储
- 对称矩阵及对称矩阵的压缩存储
- ubuntu系统安装eclipse
- 跟Google学写代码--Chromium/base--stl_util源码学习及应用
- 进程管理(一)
- QT开发之IP协议
- Android greenDAO的使用,工具类封装
- 对称矩阵的压缩存储
- 牛客:剑指offer:数字在排序数组中出现的次数 (Java)
- 解决友盟分享的报错的利器——debug模式
- 【原创】【NOIP1999】拦截导弹
- Wildfly配置PostgreSQL数据源
- 剑指offer面试题7:用两个栈实现队列(Java实现)
- CCF编译出错
- <STL>模拟实现Vector
- 欢迎使用CSDN-markdown编辑器