/*陣列的壓縮儲存:
在一些高階矩陣中,非零元素非常少,此時如果使用二維陣列將造成
儲存空間的浪費,這時可只儲存部分元素,從而提高儲存空間的利用
率,通常的做法是為多個相同值的元素只分配乙個儲存單元,對值為
零的元素不分配儲存單元。我們把非零元素個數遠小於二維陣列總元
素個數,或元素分布呈一定規律的(對稱矩陣,三角矩陣,對角矩陣)
特殊矩陣壓縮儲存。
對稱矩陣:
矩陣元素的值與下標的關係: a(i,j) = a(j,i)
我們只需為每一對稱元素分配乙個儲存單元,這樣可以將 n*n 個
元素儲存在乙個 n(n+1)/2 的儲存空間裡。
假設用以為陣列儲存上三角或下三角元素。則一維陣列的下標 k
與 n 階對稱陣的元素 a(i,j) 的下標對應關係為:
如果 i >= j 時,以下三角儲存, k = i*(i+1)/2 + j
如果 i < j 時,以上三角儲存, k = j*(j+1)/2 + i
三角矩陣:
分為上三角矩陣和下三角矩陣,其中在上三角矩陣中,下三角元素
全部為乙個常數c,下三角矩陣中,上三角元素全部為乙個常數c。
以上三角矩陣為例,上三角矩陣的壓縮規則是只儲存上三角元素,
不儲存下三角元素,或只用乙個儲存單元儲存下三角非零元素
用一維陣列儲存上三角矩陣,採取使用乙個儲存單元儲存下三角元
素的方法,一維陣列的長度為 n*(n+1)/2 + 1 一維陣列的下標 k與
n 階上三角矩陣的元素 a(i,j) 的下標對應關係為:
如果 i <= j, k = i*(2n-i+1)/2 + j -i
如果 i > j , k = n*(n+1)/2
下三角矩陣使用一維陣列儲存後相應的對應關係為:
如果 i >= j, k = i*(i+1)/2 + j
如果 i < j, k = n*(n+1)/2
其中第 k = n*(n+1)/2 的位置存放的是常數 c
以上三角矩陣為例:
# include # define n 5
int main(void)
;int i, j, k;
for (i = 0; i < n; ++i)
else}}
for (i = 0; i < n; ++i)
return 0;
}輸出結果:
1 2 3 4 5
0 6 7 8 9
0 0 10 11 12
0 0 0 13 14
0 0 0 0 15
對角矩陣:(數學上的問題 <-0-0->)
也稱為帶狀矩陣,就是所有的非零元素都集中在以對角線為中心的帶狀
區域內(對角線的個數字奇數),即除了主對角線和主對角線上下若干
條對角線的元素外,其它元素均為常數 c .
*//*
假設已有乙個 n*n 的 上三角矩陣 a ,且上三角矩陣 a 的元素已按行為主序連續壓縮
存放在陣列 b 中,設計乙個演算法,將 b 中的元素案列為主序連續壓縮存放在陣列 c中
1 2 3 4 5
0 6 7 8 9
a(5*5) = 0 0 10 11 12
0 0 0 13 14
0 0 0 0 15
其中 b = ,
c = .
思路:將一維陣列b還原成二維陣列a,再將二維陣列儲存在c中
*/# include
# define n
5void trans_to_original(int arry[n][n], int *arr);
void trans_to_compress(int arry[n][n], int *arr);
void show(int arry[n][n], int * arr1, int *arr2);
int main(void);
int a[n][n] = ;
trans_to_original(a, b);
//建立乙個一維陣列儲存以列為主序壓縮所得的資料
int c[(n+1)*n/2 + 1
]; trans_to_compress(a, c);
//將三個陣列列印輸出
show(a, b, c);
return0;
}void trans_to_original(int arry[n][n], int *arr)
else}}
return;}
void trans_to_compress(int arry[n][n], int *arr)
}arr[(n+1)*n/2] = 0
;
return;}
void show(int arry[n][n], int * arr1, int *arr2)
printf("\n
");}
printf(
"以行為主序壓縮所得結果為:\n");
for (k = 0; k < (n+1)*n/2; ++k)
printf(
"\n以列為主序壓縮所得結果為:\n");
for (k = 0; k < (n+1)*n/2; ++k)
printf("\n
");return
;}
資料結構 壓縮特殊矩陣
矩陣是一種常用的數學物件,一般情況下,小的矩陣我們可以直接用二維陣列直觀方便地儲存,但是在科學與工程計算問題中常會遇到較高階數的矩陣,並且矩陣中會出現大量零元素,或者矩陣中的元素呈某種規律分布。如果在這種情況下仍然採用二維陣列描述矩陣,看起來儲存密度為1,實際上卻占用了許多單元去儲存零元素或重複的非...
資料結構 稀疏矩陣的壓縮儲存
目錄 關於矩陣 稀疏矩陣 行優先和列優先 稀疏矩陣的壓縮儲存 在矩陣中,若數值為0的元素數目遠遠多於非0元素的數目,並且非0元素分布沒有規律時,則稱該矩陣為稀疏矩陣 與之相反,若非0元素數目佔大多數時,則稱該矩陣為稠密矩陣。如這個稀疏矩陣,這個矩陣占用了6 7的元素型別大小,但是裡邊有大量的0,即有...
資料結構 矩陣
學過線性代數的我們都知道,矩陣其實就是乙個二維的 那麼資料結構中的矩陣其實也是一樣的,計算機中可以用矩陣這種形式來儲存資料。那麼我麼怎麼表示矩陣呢?在這裡我們仍然可以使用陣列來表示,不過,矩陣始終是個二維的東西,那麼我們怎麼用陣列來表示二維的 答案很簡單,使用二維陣列即可!什麼二維陣列,其實一句話就...