全网整合营销服务商

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

免费咨询热线: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 


相关文章: 建站之星安装后界面空白如何解决?  ,如何利用word制作宣传手册?  C++如何将C风格字符串(char*)转换为std::string?(代码示例)  用v-html解决Vue.js渲染中html标签不被解析的问题  杭州银行网站设计制作流程,杭州银行怎么开通认证方式?  宿州网站制作公司兴策,安徽省低保查询网站?  网站制作和推广的区别,想自己建立一个网站做推广,有什么快捷方法马上做好一个网站?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  成都响应式网站开发,dw怎么把手机适应页面变成网页?  已有域名和空间如何搭建网站?  如何快速搭建虚拟主机网站?新手必看指南  大连网站设计制作招聘信息,大连投诉网站有哪些?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  微网站制作教程,我微信里的网站怎么才能复制到浏览器里?  建站中国必看指南:CMS建站系统+手机网站搭建核心技巧解析  平台云上自助建站如何快速打造专业网站?  如何自己制作一个网站链接,如何制作一个企业网站,建设网站的基本步骤有哪些?  宁波免费建站如何选择可靠模板与平台?  建站之星客服服务时间及联系方式如何?  合肥做个网站多少钱,合肥本地有没有比较靠谱的交友平台?  如何用已有域名快速搭建网站?  Swift开发中switch语句值绑定模式  公司网站制作费用多少,为公司建立一个网站需要哪些费用?  公司网站制作需要多少钱,找人做公司网站需要多少钱?  网站制作外包价格怎么算,招聘网站上写的“外包”是什么意思?  建站之星安装路径如何正确选择及配置?  建站之星官网登录失败?如何快速解决?  如何在VPS电脑上快速搭建网站?  东莞专业制作网站的公司,东莞大学生网的网址是什么?  香港网站服务器数量如何影响SEO优化效果?  Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递  南阳网站制作公司推荐,小学电子版试卷去哪里找资源好?  视频网站app制作软件,有什么好的视频聊天网站或者软件?  测试制作网站有哪些,测试性取向的权威测试或者网站?  建站上传速度慢?如何优化加速网站加载效率?  制作ppt免费网站有哪些,有哪些比较好的ppt模板下载网站?  建站之星上传入口如何快速找到?  制作网站的软件免费下载,免费制作app哪个平台好?  如何选择服务器才能高效搭建专属网站?  如何选择可靠的免备案建站服务器?  免费网站制作appp,免费制作app哪个平台好?  如何通过wdcp面板快速创建网站?  定制建站哪家更专业可靠?推荐榜单揭晓  网页制作模板网站推荐,网页设计海报之类的素材哪里好?  广州网站制作公司哪家好一点,广州欧莱雅百库网络科技有限公司官网?  西安大型网站制作公司,西安招聘网站最好的是哪个?  常州自助建站工具推荐:低成本搭建与模板选择技巧  建站之星2.7模板快速切换与批量管理功能操作指南  武汉外贸网站制作公司,现在武汉外贸前景怎么样啊?  导航网站建站方案与优化指南:一站式高效搭建技巧解析 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。