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

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
相关文章:
广州商城建站系统开发成本与周期如何控制?
已有域名能否直接搭建网站?
魔方云NAT建站如何实现端口转发?
如何用已有域名快速搭建网站?
装修招标网站设计制作流程,装修招标流程?
如何选择高效稳定的ISP建站解决方案?
javascript中的try catch异常捕获机制用法分析
c++怎么用jemalloc c++替换默认内存分配器【性能】
如何通过商城免费建站系统源码自定义网站主题?
黑客入侵网站服务器的常见手法有哪些?
如何在万网ECS上快速搭建专属网站?
香港网站服务器数量如何影响SEO优化效果?
电商平台网站制作流程,电商网站如何制作?
如何高效完成独享虚拟主机建站?
如何基于云服务器快速搭建网站及云盘系统?
青岛网站建设如何选择本地服务器?
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
北京营销型网站制作公司,可以用python做一个营销推广网站吗?
如何快速配置高效服务器建站软件?
如何制作新型网站程序文件,新型止水鱼鳞网要拆除吗?
建站主机助手选型指南:2025年热门推荐与高效部署技巧
专业网站制作企业网站,如何制作一个企业网站,建设网站的基本步骤有哪些?
如何通过云梦建站系统实现SEO快速优化?
大连网站制作公司哪家好一点,大连买房网站哪个好?
简单实现Android文件上传
Python多线程使用规范_线程安全解析【教程】
大连网站设计制作招聘信息,大连投诉网站有哪些?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
北京的网站制作公司有哪些,哪个视频网站最好?
家庭建站与云服务器建站,如何选择更优?
详解免费开源的DotNet二维码操作组件ThoughtWorks.QRCode(.NET组件介绍之四)
建站与域名管理如何高效结合?
香港服务器选型指南:免备案配置与高效建站方案解析
制作假网页,招聘网的薪资待遇,会有靠谱的吗?一面试又各种折扣?
公司门户网站制作流程,华为官网怎么做?
jQuery 常见小例汇总
网站制作价目表怎么做,珍爱网婚介费用多少?
已有域名和空间如何搭建网站?
高防服务器租用指南:配置选择与快速部署攻略
网站制作中优化长尾关键字挖掘的技巧,建一个视频网站需要多少钱?
如何在Golang中处理模块冲突_解决依赖版本不兼容问题
公司网站制作费用多少,为公司建立一个网站需要哪些费用?
电脑免费海报制作网站推荐,招聘海报哪个网站多?
建站之星安装后如何自定义网站颜色与字体?
如何确保FTP站点访问权限与数据传输安全?
如何在腾讯云服务器快速搭建个人网站?
浅析上传头像示例及其注意事项
如何通过智能用户系统一键生成高效建站方案?
如何快速搭建个人网站并优化SEO?
如何选择服务器才能高效搭建专属网站?
*请认真填写需求信息,我们会在24小时内与您取得联系。