国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++ 數據結構之對稱矩陣及稀疏矩陣的壓縮存儲

2020-01-26 13:58:01
字體:
來源:轉載
供稿:網友

對稱矩陣及稀疏矩陣的壓縮存儲

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++ 數據結構實現稀疏矩陣與對稱矩陣,如有疑問請留言或者到本站社區交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 淅川县| 郎溪县| 泰来县| 隆昌县| 三江| 芦山县| 广汉市| 嘉兴市| 丘北县| 宁陕县| 满洲里市| 旺苍县| 开鲁县| 深泽县| 金秀| 来凤县| 定远县| 泽州县| 阳信县| 搜索| 保靖县| 江油市| 错那县| 阳高县| 商水县| 安泽县| 巢湖市| 辉县市| 信丰县| 中超| 融水| 永川市| 连州市| 栾川县| 霍州市| 镇康县| 宁安市| 武陟县| 池州市| 新巴尔虎右旗| 九龙县|