資料結構 稀疏矩陣轉置

2022-05-30 04:03:13 字數 4227 閱讀 9743

**

我們來看看這個矩陣,五行五列,可以包含二十五個元素,但是此矩陣只有七個元素。但是我們在存放資料的時候分配了二十五塊int單元。這樣是不是有點太 浪費了。如果我們只儲存這七個元素我想會節省一部分記憶體空間。但是如果我們只儲存矩陣中的元素還是不行的,因為只有元素我們就無法還原矩陣,我們還需要此 元素的行列值。這樣就好辦了。我們宣告乙個結構體來表示乙個元素。就像這樣:

1  typedef struct

juzhen

2;

然後可以開始矩陣轉置:

我們需要定義乙個陣列來表示稀疏矩陣,並賦值;

1

#define max_term 1523

struct juzhen a[max_term]; //

存放矩陣中元素數值不為零的元素45

int chushi(struct juzhen a[max_term]) //

初始化稀疏矩陣621

}22}23 a[0].col = 5; //

矩陣的總列數

24 a[0].row = 5; //

矩陣的總行數

25 a[0].value = --count_a; //

矩陣中的元素個數

2627

return

count_a;

28 }

我們在轉置矩陣的時候會需要乙個陣列來儲存轉置後的矩陣,定義為:

struct juzhenb[max_term];

主要思想,兩層迴圈,第一層迴圈控制矩陣的行,第二層迴圈控制陣列a的行。由於轉置矩陣即把矩陣中元素的列行對換一下,並且按照行排序;所以我們在第二層迴圈中做乙個判斷,if(a[j].col == i) 【i控制第一層迴圈,j控制第二層迴圈】 如果為真值則執行:

1 b[count_b].row =a[j].col;

2 b[count_b].col =a[j].row;

3 b[count_b].value = a[j].value;

整個函式如下:

1

void zhuanzhi_1(struct juzhen a[max_term],struct juzhen b[max_term]) //

轉置矩陣方法一219

}20}21 }

用此方法可以有效的轉置矩陣,我們來看一下此函式的時間複雜度:o(cols * elements)——矩陣的列*矩陣的元素總和;

如果元素很多就會浪費很多的時間。有沒有辦法讓兩層迴圈變成一層迴圈呢?付出空間上的代價,換取時間效率;

我們只用一層迴圈來遍歷陣列a中所有元素,並把該元素放到指定的位置。這樣我們就需要乙個陣列star來存放第i個元素所在位置。在定義這個陣列之前,我們還需要乙個陣列term來實現統計矩陣第i行元素的數量。這樣我們才能更方便的知道第i個元素應該存放的位置。

1

int term[n],star[n]; //

儲存轉置矩陣第i行元素的數量 儲存第i行開始位置

2int n = a[0

].value;

3int

i,j,k;

4int

b_star;56

for(i = 0;i < n;i++)

7 term[i] = 0;8

9for(j = 0;j <= n;j++)

10 term[a[j].col]++;

1112 star[0] = 1;13

for(k = 1;k < n;k++)

14 star[k] = star[k - 1] + term[k - 1];

第乙個迴圈初始化term,每個元素都為零。第二個迴圈是為了統計第i行元素的數量。第三個迴圈是設定第i個元素所在的位置。因為陣列a的第乙個元素是存放行列和元素的總數,因此第三個迴圈要從k = 1開始。此時兩個陣列的元素為:

下一步就是遍歷a中的所有元素,然後根據a[i].col的值來把a[i].value放到指定的位置。

1 b[0].col = a[0

].col;

2 b[0].row = a[0

].row;

3 b[0].value = a[0

].value;

4for(i = 1;i <= n;i++)

5

需要注意的是b的第乙個元素與a中的第乙個元素是同樣的。b_star = star[a[i].col]++;因為當term[1] = 2;而star[1] = 3;就是a[i].col = 1時有兩個元素,第乙個元素的位置是star[a[i].col];而第二個元素的位置就是star[a[i].col] + 1所以在此用star[a[i].col]++。為下乙個元素設定相應的位置;

完整函式:

1

void zhuanhuan_2(struct juzhen a[max_term],struct

juzhen b[max_term])228

29 }

此函式每個迴圈體的執行次數分別為cols cols elements elements 時間複雜度為o(cols + elements)和o(cols * elements)相差好多,尤其是clos 和 elements很大的時候;

完整的測試程式:

1

完整**

2 #include3

#define n 5

4#define max_term 15

56 typedef struct

juzhen7;

1213

int text[5] = ,,,,};

14struct juzhen a[max_term]; //

存放矩陣中元素數值不為零的元素

15struct juzhen b[max_term]; //

轉置後的矩陣

1617

int chushi(struct juzhen a[max_term]) //

初始化稀疏矩陣

1833}34

}35 a[0].col = 5; //

矩陣的總列數

36 a[0].row = 5; //

矩陣的總行數

37 a[0].value = --count_a; //

矩陣中的元素個數

3839

return

count_a;40}

4142

void showjuzhen(struct juzhen a[max_term],int count_a) //

顯示稀疏矩陣

4355

else

56 printf("0 "

);57

}58 printf("\n"

);59}60

61}6263

void showjuzhen_2(struct juzhen a[max_term],int count_a) //

顯示稀疏矩陣方法二

6471}72

7374

void zhuanzhi_1(struct juzhen a[max_term],struct juzhen b[max_term]) //

轉置矩陣方法一

7592}93

}94}95

9697

void zhuanhuan_2(struct juzhen a[max_term],struct

juzhen b[max_term])

98124

125126

for(i = 0;i < a[0].value + 1;i++)

127 printf("

%d| %d %d %d\n

",i,b[i].row,b[i].col,b[i].value);

128129

}130

131int main(void

)132

稀疏矩陣轉置 資料結構

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...

資料結構 稀疏矩陣的轉置

熟悉稀疏矩陣的三元組順序儲存方式。稀疏矩陣如圖所示,輸出矩陣和三元組錶用轉置演算法 求轉置矩陣並輸出轉置後的矩陣和三元組表 初始矩陣為 n dispmatrix mm printf 矩陣的三元組順序表為 n dispmat mm printf n n tsmatrix t trantat mm,t ...

《資料結構》複習之稀疏矩陣(矩陣轉置)

矩陣在資料結構中常用二維陣列 int a m n m為列的元素個數,n為行的元素個數 表示,這也是最簡單的表示方法。然而當矩陣中含有大量0元素時,也稱為稀疏矩陣,這樣的表示方法會浪費大量的儲存空間,為了節省儲存單元,最好只存非零元素。常用的儲存稀疏矩陣的方法有順序儲存和鏈式儲存兩種,這裡只介紹順序儲...