矩陣在資料結構中常用二維陣列(int a[m][n],m為列的元素個數,n為行的元素個數)表示,這也是最簡單的表示方法。
然而當矩陣中含有大量0元素時,也稱為稀疏矩陣,這樣的表示方法會浪費大量的儲存空間,為了節省儲存單元,最好只存非零元素。常用的儲存稀疏矩陣的方法有順序儲存和鏈式儲存兩種,這裡只介紹順序儲存。
稀疏矩陣的順序儲存方法也被稱為三元組表示法,資料結構如下:
typedef
struct ele
ele;
typedef
struct t
t;
除了結構體的定義,總的來說就是用乙個陣列來記錄非零元素的資訊。
對於普通的矩陣來說,矩陣轉置很簡單,比如要將a[nu][mu]轉置成b[mu][nu]。只需要兩個for迴圈,**如下:
for(i=0;i
i++)
它的時間複雜度為o(n2)。
對於稀疏矩陣來說,轉置演算法可以是這樣的。
它的時間複雜度也是o(n2)。
但是我們可以用技巧將轉置的複雜度o(n)。**如下:
#include
#include
using
namespace
std;
typedef
struct ele
ele;
typedef
struct t
t;void tran(t t1, t &t2)
int loc[1000];
memset(loc, 0, sizeof(loc));
loc[0] = 0;
for (i = 1; i//計算每列元素應該在陣列中儲存的起始位置
for (i = 0; i//開始在陣列中
}int main()}}
tran(t1, t2); //呼叫轉置函式
num = 0;
for (i = 0; i//輸出矩陣
else
}cout
<< endl;
}return
0;}
**中展示了稀疏矩陣的輸入輸出和轉置。對於轉置演算法,最主要的是找到轉置的元素在陣列中的位置,如果找到了位置,我們將它放入相應的位置即可。由於,轉置過程中,列變成了行,為了找到位置,我們計算列座標為0-n的元素的個數(思想是列座標為0轉置後行座標就為0,應該放在陣列前面),在計算每列元素應該在陣列中儲存的起始位置(loc[i] = loc[i - 1] + count[i - 1]),起始位置等於前面的列的起始位置+前面列元素的個數。計算算出起始位置後,就可以將元素放入相應的位置。記住,每放乙個元素後,起始位置要加1。 稀疏矩陣轉置 資料結構
description 輸出稀疏矩陣的轉置矩陣。行列均不大於20 input 第一行輸入兩個正整數n和m,分別表示矩陣的行數和列數,然後輸入矩陣三元組,最後輸入 0 0 0 表示結束輸入。output 轉置後的矩陣。sample input 4 41 1 1 2 1 2 3 2 3 0 0 0 sa...
資料結構 稀疏矩陣轉置
我們來看看這個矩陣,五行五列,可以包含二十五個元素,但是此矩陣只有七個元素。但是我們在存放資料的時候分配了二十五塊int單元。這樣是不是有點太 浪費了。如果我們只儲存這七個元素我想會節省一部分記憶體空間。但是如果我們只儲存矩陣中的元素還是不行的,因為只有元素我們就無法還原矩陣,我們還需要此 元素的行...
資料結構 稀疏矩陣的轉置
熟悉稀疏矩陣的三元組順序儲存方式。稀疏矩陣如圖所示,輸出矩陣和三元組錶用轉置演算法 求轉置矩陣並輸出轉置後的矩陣和三元組表 初始矩陣為 n dispmatrix mm printf 矩陣的三元組順序表為 n dispmat mm printf n n tsmatrix t trantat mm,t ...