1. 程式人生 > >陣列9——陣列的壓縮儲存1——基本內容

陣列9——陣列的壓縮儲存1——基本內容

【壓縮儲存】

有些高階矩陣中,非零的元素非常少,此時若使用二維陣列將造成儲存空間的浪費,這時,可只儲存部分元素,從而提高儲存空間的利用率。通常的做法是為多個相同值的元素只分配一個儲存單元,對值為零的元素不分配儲存單元。這種儲存方式稱為矩陣的壓縮儲存。我們把非零元素非常少(遠小於m×n)或元素分佈呈一定規律的矩陣稱為特殊矩陣。對稱矩陣、三角矩陣和對角矩陣都屬於特殊矩陣。


【對稱矩陣】

如果一個n階矩陣A的元素滿足性質

aij=aji

則稱這種矩陣為n階對稱矩陣,每一對對稱元素值相等,我們只需為每一對對稱元素分配一個儲存空間這樣既可將n×n個元素儲存在n(n+1)/2的儲存單元裡。一個n階的對稱矩陣A

如圖所示

 


假設用一維陣列s儲存對稱矩陣A的上三角元素或下三角元素,則一維陣列s的下標k與n階對稱矩陣A的元素aij之間的關係為:

當i≥j,矩陣A以下三角形式儲存,i*(i+1)/2+j為矩陣A中的元素的線性排序編號;

當i<j,矩陣A以上三角形式儲存,j*(j+1)/2+i為矩陣A中的元素的線性排序編號。任意給定一組下標(i,j)就可以確定矩陣A在一維陣列s中的儲存位置。我們將s稱為n階對角矩陣A的壓縮儲存。


【三角矩陣】

三角矩陣分為兩種:上三角矩陣和下三角矩陣。其中,下三角元素均為常數c或零的n階矩陣稱為上三角矩陣,上三角元素均為常數c或者零的n階矩陣稱為下三角矩陣。n×n的上三角矩陣和下三角矩陣

如圖所示

 

上三角矩陣的壓縮原則是隻儲存上三角元素,不儲存下三角的零元素(或只用一個儲存單元儲存下三角的非零元素)。下三角矩陣的儲存單元儲存元素與此類似。如果用一維陣列來儲存三角矩陣,則需要n*(n+1)/2+1個元素,一維陣列的下標k與矩陣的下標(i,j)的對應關係為:

公式:


公式:

其中,第k=n*(n+1)個位置存放的是常數c或者零元素。上述公式可根據等差數列推導得出。

【對角矩陣】

對角矩陣(也稱為帶狀矩陣)是另一類特殊矩陣。所謂對角矩陣,就是所有的非零元素都集中在以主對角線為中心的帶狀區域內(對角線的個數為奇數)。也就是說,除了主對角線和主對角線上、下若干條對角線上的元素外,其他元素的值均為零。一個3對角矩陣

如圖所示。

通過觀察,我們發現以上對角矩陣具有以下特點:

當i=0,j=1,2時,即第一行有兩個非零元素;
當0<i<n-1,j=i-1,i,i=1時,即第二行到第n-1行之間有三個非零元素;當i=n-1,j=n-2,n-1時,即最後一行有兩個非零元素。除此之外,其他元素均為零。


除了第一行和最後一行非零元素為2個,其餘各行非零元素為3個,因此若用一維陣列儲存這些非零嚴肅,需要2+3*(n-2)+2=3n-2個儲存單元。

下面來確定一維陣列的下標k與矩陣的下標(i,j)之間的關係。先確定下標為(i,j)的元素與第1個元素之間在一維陣列中的關係,用Loc(i,j)表示aij在一維陣列中的位置,Loc(0,0)表示第一個元素在一維陣列中的地址。

Loc(i,j)=Loc(0,0)+前i-1行的非零元素個數+第i行的非零元素個數,其中,前i-1行的非零元素個數為3*(i-1)-1,第i行的非零元素個數為j-i+1。其中

公式。