最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ 數(shù)據(jù)結(jié)構(gòu)之對稱矩陣及稀疏矩陣的壓縮存儲

 更新時間:2017年08月11日 15:18:21   投稿:lqh  
這篇文章主要介紹了C++ 數(shù)據(jù)結(jié)構(gòu)之對稱矩陣及稀疏矩陣的壓縮存儲的相關(guān)資料,這里實(shí)現(xiàn)稀疏矩陣和對稱矩陣的壓縮存儲的實(shí)例,需要的朋友可以參考下

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

1.稀疏矩陣

 對于那些零元素?cái)?shù)目遠(yuǎn)遠(yuǎn)多于非零元素?cái)?shù)目,并且非零元素的分布沒有規(guī)律的矩陣稱為稀疏矩陣(sparse)。

  人們無法給出稀疏矩陣的確切定義,一般都只是憑個人的直覺來理解這個概念,即矩陣中非零元素的個數(shù)遠(yuǎn)遠(yuǎn)小于矩陣元素的總數(shù),并且非零元素沒有分布規(guī)律。

實(shí)現(xiàn)代碼:

//稀疏矩陣及其壓縮存儲 
#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; 
 } 
 //普通轉(zhuǎn)置(行優(yōu)先存儲) 
 //列變行,從0列開始,將列數(shù)據(jù)一個一個放進(jìn)轉(zhuǎn)置矩陣 
 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];//記錄每行的元素個數(shù) 
  memset(count, 0, sizeof(int)*_col); 
  int* start = new int[_col];//轉(zhuǎn)置矩陣中元素的位置 
  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.對稱矩陣

實(shí)現(xiàn)代碼:

//對稱矩陣及其壓縮存儲 
 
#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++ 數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn)稀疏矩陣與對稱矩陣,如有疑問請留言或者到本站社區(qū)交流討論,感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!

相關(guān)文章

  • Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程

    Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程

    Microsoft Visual Studio 2022是Microsoft Visual Studio軟件的一個高版本,能夠編寫和執(zhí)行C/C++代碼,具有強(qiáng)大的功能,是開發(fā)C/C++程序的主流軟件,這篇文章主要介紹了Microsoft Visual Studio 2022的安裝與使用詳細(xì)教程
    2024-01-01
  • 基于Qt實(shí)現(xiàn)可拖動自定義控件

    基于Qt實(shí)現(xiàn)可拖動自定義控件

    這篇文章主要為大家詳細(xì)介紹了如何基于Qt實(shí)現(xiàn)可拖動自定義控件,文中的示例代碼講解詳細(xì),具有一定的借鑒價值,感興趣的小伙伴可以了解一下
    2023-04-04
  • C++學(xué)習(xí)之函數(shù)模板的使用詳解

    C++學(xué)習(xí)之函數(shù)模板的使用詳解

    函數(shù)模板可以適用泛型來定義函數(shù),其中泛型可以是(int, double, float)等替換。這篇文章主要來和大家聊聊函數(shù)模板的具體使用,感興趣的可以了解一下
    2023-03-03
  • C語言scanf語句吃掉回車或者空格問題及解決

    C語言scanf語句吃掉回車或者空格問題及解決

    這篇文章主要介紹了C語言scanf語句吃掉回車或者空格問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-11-11
  • C++結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)貪吃蛇

    C++結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)貪吃蛇

    這篇文章主要為大家詳細(xì)介紹了C++結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • C語言簡明講解單引號與雙引號的使用

    C語言簡明講解單引號與雙引號的使用

    這篇文章主要介紹了在C語言里單引號和雙引號的使用,本文通過實(shí)例代碼說明了單引號和雙引號的概念與各自的用法,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2022-04-04
  • C++如何去除cpp文件的注釋詳解

    C++如何去除cpp文件的注釋詳解

    在日常工作中,我們會給c/c++代碼寫上一些注釋,但是往往為了保持最終的代碼盡可能小,我們需要刪除注釋,手動刪除太緩慢了,下面這篇文章主要給大家介紹了關(guān)于C++如何去除cpp文件注釋的相關(guān)資料,需要的朋友可以參考下
    2022-09-09
  • C++詳細(xì)講解引用類型

    C++詳細(xì)講解引用類型

    引用指的是對一個對象的引用。那么什么是對象?在c++中狹義的對象指的是用類,結(jié)構(gòu),聯(lián)合等復(fù)雜數(shù)據(jù)類型來聲明的變量,如?MyClass?myclass,CDialog?mydlg,等等
    2022-07-07
  • C語言可變長的參數(shù)列表詳解

    C語言可變長的參數(shù)列表詳解

    這篇文章主要為大家介紹了C語言可變長的參數(shù)列表,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助
    2022-01-01
  • C++中的new/delete、構(gòu)造/析構(gòu)函數(shù)、dynamic_cast分析

    C++中的new/delete、構(gòu)造/析構(gòu)函數(shù)、dynamic_cast分析

    這篇文章主要介紹了C++中的new/delete、構(gòu)造/析構(gòu)函數(shù)、dynamic_cast分析 本文通過實(shí)例代碼給大家介紹的非常詳細(xì),具有一定的參考借鑒價值,需要的朋友可以參考下
    2019-05-05

最新評論

吉安县| 平安县| 广州市| 南雄市| 东源县| 仙游县| 古蔺县| 谢通门县| 新津县| 大英县| 永兴县| 新野县| 海宁市| 上犹县| 凤翔县| 景德镇市| 开封县| 宝丰县| 家居| 工布江达县| 博湖县| 岐山县| 镇宁| 丰城市| 宜兰县| 望奎县| 得荣县| 奈曼旗| 宝丰县| 平安县| 绵阳市| 治县。| 佛冈县| 汉源县| 久治县| 柏乡县| 东乡| 高平市| 达拉特旗| 香河县| 合水县|