全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

C++ 数据结构之对称矩阵及稀疏矩阵的压缩存储

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

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小时内与您取得联系。