關於陣列,大家並不陌生,幾乎所有的程式語言都把陣列型別設為了固有型別。
陣列是n(n>1)個相同型別資料元素構成的有限序列,它是下標-值偶對的集合,即集合中的每乙個元素都是由乙個值和一組下標組成的。
陣列一般分為一維、二維、三維陣列,其中二維陣列也稱為矩陣,本文主要講解對於矩陣中稀疏矩陣的相關操作演算法。
在矩陣中,當數值為0的元素遠遠多於非0元素的個數,且非0元素的分布並沒有規律時,稱該矩陣為稀疏矩陣。
例如:
對於稀疏矩陣,我們通常採用三元組的形式來進行壓縮,不考慮0元素的個數和位置,只記錄非0元素的行列位置和資料值。
三元組:(行號,列號,值)
上圖的稀疏矩陣的三元組表示為:
假設以順序儲存結構來儲存三元組表,則可以得到稀疏矩陣的一種壓縮方式——三元組順序表。
三元組順序表的相關定義
#include
using
namespace std;
#define maxsize 1000
//最大儲存容量
#define ok 1
#define false 0
typedef
int elemtype;
typedef
int status;
typedef
struct
triple;
//三元組(行號,列號,值)
typedef
struct
tsmatrix;
//稀疏矩陣
故此時稀疏矩陣的圖示為:
首先輸入乙個稀疏矩陣,然後將其壓縮成三元組表。
void
creatematrix
(tsmatrix &m)
cout << endl;
for(h =
1; h <= a; h++
)//將稀疏矩陣的非零元個數表示為三元組表
} m.tu = m;
m.mu = a;
m.nu = b;
}}
以三元組表的形式輸出非零元素void
printtriple
(tsmatrix m)
輸出稀疏矩陣
將有三元組表中對應位置的元素賦值,其餘的均賦值為0
void
printmatrix
(tsmatrix m)
else}}
cout <<
"稀疏矩陣為:"
<< endl;
for(a =
1; a <= m.mu; a++
)}
轉置運算status transposematrix
(tsmatrix m,tsmatrix &t)}}
return ok;
}
快速轉置
由於上面演算法的時間複雜度太高,為o(m.nu*m.mu),故將演算法改進,降低時間複雜度。
思路如下:
求原矩陣中每一行的三元組個數求原矩陣中的每一行中第乙個三元組在轉置後矩陣中的序號講原矩陣中每個三元組根據序號依次轉換到轉置後矩陣的相應位置
故在原矩陣中增加了
陣列num來記錄原矩陣中每列的非零元素個數(即轉置後矩陣中每行的非零元個數)
陣列pos來記錄轉置後矩陣中每行第乙個元素的位置
status transposematrix_plus
(tsmatrix m, tsmatrix& t)
for(k =
1; k <= m.tu; k++
)//第二步:確定t中各行元素的起始位置pos值
for(j =
2; j <= m.nu; j++
)//第三步:依次轉置矩陣
for(k =
1; k <= m.tu; k++)}
return ok;
}
隨意編寫了個主函式來進行測試,轉置用的是快速轉置演算法
void
main()
執行結果如下:
儀式感過後,人煙消散,最委屈的還是主角。
稀疏矩陣轉置
輸出稀疏矩陣的轉置矩陣。行列均不大於20 第一行輸入兩個正整數n和m,分別表示矩陣的行數和列數,然後輸入矩陣三元組,最後輸入 0 0 0 表示結束輸入。轉置後的矩陣。include include define maxsize 100 typedef struct triple typedef st...
稀疏矩陣轉置矩陣
num 矩陣a中某列的非零元素的個數 cpot 初值表示矩陣a中某列第乙個非零元素在b中的位置,並有如下遞推 cpot 1 0 cpot col cpot col 1 num col 1 2 col nu end right.const int maxterm 100 struct sparsema...
稀疏矩陣的轉置
稀疏矩陣的轉置 使用了兩個輔助陣列 num num j 矩陣a中第j列非零元素的個數 cpot cpot j 矩陣a中第j列的第乙個非零元素在其轉置矩陣b的三元組順序表的位置。推出2個規則 1 cpot 1 1 2 cpot j cpot j 1 num j 1 演算法思路 根據1,2規則計算num...