這裡主要論述一下疏鬆陣列的轉置演算法,由於疏鬆陣列指的是矩陣中30%以下的內容是非零元素,這個時候我們不需要再用mxn的數組去儲存這個矩陣,這樣就比較浪費儲存空間了,同時在執行轉置的時候演算法開銷也比較大,我們這個時候可以使用三元組的形式儲存矩陣中的非零元素,三元組指的是用三個量來描述數組中的非零元素分別是行號,列號和資料。這樣一來就可以節約儲存空間。不多說了,先上代碼。
#include<stdio.h>#define MAXSIZE 1000#define TRUE 1#define FALSE 0typedef int EleType;typedef struct { int row; int col; EleType e;}Triple;typedef struct { Triple data[MAXSIZE+1]; int m; int n; int length;}TSMatrix;void initA (TSMatrix *A) ;int TransposeTSMatrix (TSMatrix A , TSMatrix *B) ;int main () { TSMatrix A; TSMatrix B; int i; initA (&A); if (TransposeTSMatrix (A , &B)) { for (i = 1 ; i <= A.length ; i++) { printf ("B.data[%d].row = %d\n" , i , B.data[i].row); printf ("B.data[%d].col = %d\n" , i , B.data[i].col); printf ("B.data[%d].length = %d\n" , i , B.data[i].e); } }}void initA (TSMatrix *A) { A->m = 6; A->n = 7; A->length = 8; A->data[1].row = 1; A->data[1].col = 2; A->data[1].e = 12; A->data[2].row = 1; A->data[2].col = 3; A->data[2].e = 9; A->data[3].row = 3; A->data[3].col = 1; A->data[3].e = -3; A->data[4].row = 3; A->data[4].col = 6; A->data[4].e = 14; A->data[5].row = 4; A->data[5].col = 3; A->data[5].e = 24; A->data[6].row = 5; A->data[6].col = 2; A->data[6].e = 18; A->data[7].row = 6; A->data[7].col = 1; A->data[7].e = 15; A->data[8].row = 6; A->data[8].col = 4; A->data[8].e = -7;}int TransposeTSMatrix (TSMatrix A , TSMatrix *B) { int i , j; int count = 1; B->m = A.n; B->n = A.m; B->length = A.length; if (B->length <= 0) return FALSE; for (i = 1 ; i <= A.n ; i++) { for (j = 1 ; j <= A.length ; j++) { if (A.data[j].col == i) { B->data[count].row = i; B->data[count].col = A.data[j].row; B->data[count].e = A.data[j].e; count++; } } } return TRUE;}總結:這個演算法由於是以行為主序的,所以以原數組的列為迴圈,遍曆整個矩陣,選取列號符合制定的數字,如果符合那麼就把資料放到相應的轉置矩陣中。不跟了睡覺了,明天還要回家,晚上再跟快速演算法吧。
————————————————————————————————————————————分割線2016.6.29