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

1.稀疏矩阵
对于那些零元素数目远远多于非零元素数目,并且非零元素的分布没有规律的矩阵称为稀疏矩阵(sparse)。
人们无法给出稀疏矩阵的确切定义,一般都只是凭个人的直觉来理解这个概念,即矩阵中非零元素的个数远远小于矩阵元素的总数,并且非零元素没有分布规律。
实现代码:
//稀疏矩阵及其压缩存储
#pragma once
#include <vector>
#include <iostream>
using namespace std;
template<class T>
struct Triple
{
size_t _r;
size_t _c;
T _value;
Triple(size_t row = 0, size_t col = 0, const T& value = T())
:_r(row)
,_c(col)
,_value(value)
{}
};
template <class T>
class SparseMatrix
{
public:
SparseMatrix()
:_row(0)
,_col(0)
,_illegal(T())
{}
SparseMatrix(T* arr, size_t row, size_t col, const T& illegal)
:_row(row)
,_col(col)
,_illegal(illegal)
{
for(size_t i = 0; i<row; ++i)
{
for(size_t j = 0; j<col; ++j)
{
if(arr[i*col+j] != illegal)
{
Triple<T> t(i,j,arr[i*col+j]);
_matrix.push_back(t);
}
}
}
}
void Display()
{
vector<Triple<T> >::iterator iter;
iter = _matrix.begin();
for(size_t i = 0; i<_row; ++i)
{
for(size_t j = 0; j<_col; ++j)
{
if(iter!=_matrix.end()
&&iter->_r == i
&&iter->_c == j)
{
cout << iter->_value <<" ";
++iter;
}
else
{
cout << _illegal <<" ";
}
}
cout << endl;
}
cout << endl;
}
//普通转置(行优先存储)
//列变行,从0列开始,将列数据一个一个放进转置矩阵
SparseMatrix<T> Transpose()
{
SparseMatrix<T> tm;
tm._row = _col;
tm._col = _row;
tm._illegal = _illegal;
tm._matrix.reserve(_matrix.size());
for(size_t i = 0; i<_col; ++i)
{
size_t index = 0;
while(index < _matrix.size())
{
if(_matrix[index]._c == i)
{
Triple<T> t(_matrix[index]._c, _matrix[index]._r, _matrix[index]._value);
tm._matrix.push_back(t);
}
++index;
}
}
return tm;
}
SparseMatrix<T> FastTranspose()
{
SparseMatrix<T> tm;
tm._row = _col;
tm._col = _row;
tm._illegal = _illegal;
tm._matrix.resize(_matrix.size());
int* count = new int[_col];//记录每行的元素个数
memset(count, 0, sizeof(int)*_col);
int* start = new int[_col];//转置矩阵中元素的位置
start[0] = 0;
size_t index = 0;
while(index < _matrix.size())
{
count[_matrix[index]._c]++;
++index;
}
for(size_t i=1; i<_col; ++i)
{
start[i] = start[i-1] + count[i-1];
}
index = 0;
while(index < _matrix.size())
{
Triple<T> t(_matrix[index]._c, _matrix[index]._r, _matrix[index]._value);
tm._matrix[start[_matrix[index]._c]++] = t; //核心代码
++index;
}
delete[] count;
delete[] start;
return tm;
}
protected:
vector<Triple<T> > _matrix;
size_t _row;
size_t _col;
T _illegal;
};
2.对称矩阵
实现代码:
//对称矩阵及其压缩存储
#pragma once
#include <iostream>
using namespace std;
template <class T>
class SymmetricMatrix
{
public:
SymmetricMatrix(T* arr, size_t n)
:_n(n)
,_matrix(new T[n*(n+1)/2])
{
size_t index = 0;
for(size_t i = 0; i<n; ++i)
{
for(size_t j=0; j<n;++j)
{
if(i >= j)
{
_matrix[index] = arr[i*n+j];
++index;
}
else
{
continue;
}
}
}
}
void Display()
{
for(size_t i =0; i < _n; ++i)
{
for(size_t j = 0; j < _n; ++j)
{
/* if(i<j)
{
swap(i,j);
cout<<_matrix[i*(i+1)/2+j]<<" ";
swap(i,j);
}
else
cout<<_matrix[i*(i+1)/2+j]<<" ";
*/
cout << Access(i,j) << " ";
}
cout << endl;
}
cout << endl;
}
T& Access(size_t row, size_t col)
{
if(row<col)
{
swap(row, col);
}
return _matrix[row*(row+1)/2+col];
}
~SymmetricMatrix()
{
if(_matrix != NULL)
{
delete[] _matrix;
_matrix = NULL;
}
}
protected:
T* _matrix;
size_t _n; //对称矩阵的行列大小
};
以上就是C++ 数据结构实现稀疏矩阵与对称矩阵,如有疑问请留言或者到本站社区交流讨论,感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
# 对称矩阵及稀疏矩阵
# 稀疏矩阵的实现
# C++稀疏矩阵的各种基本运算并实现加法乘法
# C++ 实现稀疏矩阵的压缩存储的实例
# C++实现稀疏矩阵的压缩存储实例
# C++超详细讲解稀疏矩阵
# 中非
# 如有
# 数据结构
# 希望能
# 谢谢大家
# 疑问请
# _value
# _c
# row
# _r
# struct
# template
# size_t
# Triple
# _row
# public
# _illegal
# _col
# const
# col
相关文章:
免费的流程图制作网站有哪些,2025年教师初级职称申报网上流程?
建站上传速度慢?如何优化加速网站加载效率?
兔展官网 在线制作,怎样制作微信请帖?
企业网站制作费用多少,企业网站空间一般需要多大,费用是多少?
如何配置支付宝与微信支付功能?
宁波免费建站如何选择可靠模板与平台?
PHP 500报错的快速解决方法
制作网站的过程怎么写,用凡科建站如何制作自己的网站?
如何快速搭建高效简练网站?
C++用Dijkstra(迪杰斯特拉)算法求最短路径
建站之星×万网:智能建站系统+自助建站平台一键生成
Android自定义listview布局实现上拉加载下拉刷新功能
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
建站之星客服服务时间及联系方式如何?
,有什么在线背英语单词效率比较高的网站?
如何在阿里云域名上完成建站全流程?
网站制作公司,橙子建站是合法的吗?
如何选择可靠的免备案建站服务器?
如何快速搭建高效可靠的建站解决方案?
红河网站制作公司,红河事业单位身份证如何上传?
如何选择高效响应式自助建站源码系统?
如何获取PHP WAP自助建站系统源码?
制作网站的软件免费下载,免费制作app哪个平台好?
台州网站建设制作公司,浙江手机无犯罪记录证明怎么开?
免费网站制作appp,免费制作app哪个平台好?
宝塔新建站点为何无法访问?如何排查?
网站制作公司排行榜,四大门户网站排名?
网站制作的步骤包括,正确网址格式怎么写?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
如何快速查询网站的真实建站时间?
深圳防火门网站制作公司,深圳中天明防火门怎么编码?
,怎么用自己头像做动态表情包?
西安专业网站制作公司有哪些,陕西省建行官方网站?
建站之星代理如何获取技术支持?
制作网站的网址是什么,请问后缀为.com和.com.cn还有.cn的这三种网站是分别是什么类型的网站?
外贸公司网站制作,外贸网站建设一般有哪些步骤?
建站OpenVZ教程与优化策略:配置指南与性能提升
制作农业网站的软件,比较好的农业网站推荐一下?
网站按钮制作软件,如何实现网页中按钮的自动点击?
如何选择靠谱的建站公司加盟品牌?
相册网站制作软件,图片上的网址怎么复制?
太平洋网站制作公司,网络用语太平洋是什么意思?
大连网站制作费用,大连新青年网站,五年四班里的视频怎样下载啊?
如何在万网开始建站?分步指南解析
如何选择域名并搭建高效网站?
百度网页制作网站有哪些,谁能告诉我百度网站是怎么联系?
建站之星代理费用多少?最新价格详情介绍
怎么制作一个起泡网,水泡粪全漏粪育肥舍冬季氨气超过25ppm,可以有哪些措施降低舍内氨气水平?
网站制作培训多少钱一个月,网站优化seo培训课程有哪些?
如何正确选择百度移动适配建站域名?
*请认真填写需求信息,我们会在24小时内与您取得联系。