今天學習了矩陣的壓縮儲存,主要是特殊矩陣和稀疏矩陣的壓縮儲存,特殊矩陣包括對稱、對角、上下三角矩陣,實現起來比較方便,這裡我主要實現了一遍稀疏矩陣的三元組順序表儲存實現以及兩種矩陣轉置方法。
稀疏矩陣一直沒有乙個明確的定義,大概的解釋就是矩陣中的非零元分布不是規律的,矩陣中非零元的個數佔整個矩陣元個數的比例,該比例成為稀疏因子,只要稀疏因子小於等於0.05,則該矩陣就可叫做稀疏矩陣
因為稀疏矩陣中的矩陣元分布不是規律的,所以乙個非零元的表示需要行列座標和本身資料表示,包含三個元素:非零元的行、列以及資料,所以叫做三元組。 而矩陣還需要包含總的行數、列數,以及總的非零元個數,對應的**表示為:
//非零元三元組
typedef
struct matrixnode matnode;
//稀疏矩陣表示
typedef
struct matrix matrix;
//矩陣的壓縮儲存
matrix matrixstorage
(int array[
3],int row,matrix matrix)}}
matrix.mu = row;
//行數
matrix.nu =
sizeof
(array[0]
)/sizeof
(array[0]
[0])
;//列數
matrix.tu = count;
//非零元個數
return matrix;
}
這一步是將矩陣進行壓縮:非零元分配乙個儲存空間,零元素不分配(這裡未實現相同元素只佔乙個空間,後面有空實現),這裡看**應該看到懂
/矩陣轉置
matrix matrixtranspose
(matrix iintmatrix, matrix aftermatrix)}}
return aftermatrix;
}
矩陣轉置的要點就是交換矩陣前後的行列數以及資料的行列位置,該種方法是按照轉置後的三元組的次序去轉置前的對應三元組次序尋找,也就是按照轉置前的列序來轉置
//快速矩陣轉置
matrix fastmatrixtranspose
(matrix initmatrix,matrix aftermatrix)
return aftermatrix;
}
這個轉置方法附設了兩個向量:代表每列非零元個數總數的陣列num;和代表每列第乙個非零元在轉置後的三元組的位置
對比上面兩種轉置可以看出:
第一種轉置的時間複雜度是o(nuxtu);當tu的數量級達到mu x nu數量級時間,時間複雜度達到了o(mu x nu x nu),所以說該方法適合tu<
第二種方法是四個迴圈,對應的時間複雜度是o(nu+tu);當tu的數量級達到mu x nu的時候,時間複雜度是o(mu xnu),相對於第一種降低不少,所以叫做快速演算法
資料結構習題 稀疏矩陣加法 三元組順序表
以下為功能函式的 define maxsize 12500 最大非零元素 typedef int elemtype typedef struct tripletriple 三元組結點定義 typedef struct tsmatrixtsmatrix 三元組順序表定義 將矩陣m和矩陣t相加的結果儲存...
稀疏矩陣的三元組順序儲存
該資料結構的操作主要是陣列的相加 和相乘,這兩個演算法全是我個人所寫,絕無參考,經測試應該少有bug a.h include define false 0 define true 1 define ok 1 define error 0 define max size 100 typedef int...
稀疏矩陣(三元組順序表實現)
定義了乙個稀疏矩陣類,有轉置和相乘,相加三個功能,主要是熟悉稀疏矩陣的三元組順序表儲存的一些操作,和一般的矩陣不同的地方,兩個轉置的演算法,第乙個是較容易想到的,書上管它叫 按需點菜 法,就是按一開始列的順序,乙個個轉為新矩陣中行的順序。第二個叫作 按位就坐 法,就是條件兩個輔助陣列,確定每一列中第...