資料結構 壓縮矩陣筆記

2022-06-29 02:03:13 字數 2739 閱讀 7280

/*

陣列的壓縮儲存:

在一些高階矩陣中,非零元素非常少,此時如果使用二維陣列將造成

儲存空間的浪費,這時可只儲存部分元素,從而提高儲存空間的利用

率,通常的做法是為多個相同值的元素只分配乙個儲存單元,對值為

零的元素不分配儲存單元。我們把非零元素個數遠小於二維陣列總元

素個數,或元素分布呈一定規律的(對稱矩陣,三角矩陣,對角矩陣)

特殊矩陣壓縮儲存。

對稱矩陣:

矩陣元素的值與下標的關係: 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,即有...

資料結構 矩陣

學過線性代數的我們都知道,矩陣其實就是乙個二維的 那麼資料結構中的矩陣其實也是一樣的,計算機中可以用矩陣這種形式來儲存資料。那麼我麼怎麼表示矩陣呢?在這裡我們仍然可以使用陣列來表示,不過,矩陣始終是個二維的東西,那麼我們怎麼用陣列來表示二維的 答案很簡單,使用二維陣列即可!什麼二維陣列,其實一句話就...