特殊矩陣的壓縮存儲
數組
數組可以看作線性表的推廣。數組作為一種數據結構其特點是結構中的元素本身可以是具有某種結構的數據,但屬於同一數據類型,數組是一個具有固定格式和數量的數據有序集, 每一個數據元素有唯一的一組下標來標識,因此,在數組上不能做插入、刪除數據元素的操作。
1、數組的定義和運算
( 1 )數組的定義
從邏輯結構上,數組可以看成是一般線性表的擴充。一維數組即為線性表, 而二維數組可以定義為“其數據元素為一維數組(線性表)”的線性表。依此類推, 即可得到多維數組的定義。N 維數組是“數據元素為 N-1 維數組”的線性表。
由數組結構可以看出,數組中的每一個元素由一個值和一組下標來描述。 “值”代表數組中元素的數據信息,一組下標用來描述該元素在數組中的相對位 置信息。數組的維數不同,描述其相對位置的下標的個數也不同。
( 2 )數組的運算
數組是一組有固定個數的元素的集合。即,一旦定義了數組的維數和每一維 的上、下限,數組中元素的的個數就固定了。例如二維數組 A3 × 4 ,它有 3 行、 4 列,即由 12 個元素組成。由於這個性質,使得對數組的操作不像對線性表的操作 那樣可以在表中任意一個合法的位置插入或刪除一個元素。對於數組的操作一般 只有兩類: ①獲得特定位置的元素值; ②修改特定位置的元素值。 因此數組的操作主要是數據元素的定位,即給定元素的下標,得到該元素在 計算機中的存放位置。其本質上就是地址計算問題。
( 3 )數組的抽象數據類型定義
數組的抽象數據類型定義如下: ADT Array{
注意:這里定義的數組與 C 語言的數組略有不同,下標統一從 1 開始。
2、數組的順序存儲
通常在各種高級語言中數組一旦被定義,每一維的大小及上下界都不能改變。
通常,數組在內存被映象為向量,即用向量作 為數組的一種存儲結構,這是因為內存的地址空間是一維的,數組的行列固定后,通過一個 映象函數,則可根據數組元素的下標得到它的存儲地址。
對於一維數組按下標順序分配即可。對多維數組分配時,要把它的元素映象存儲在一維存儲器中,一般有兩種存儲方式:一是以行為主序(或先行后列)的順序存放,另一種是以列為主序(先列后行)的順序存放。
設有 m×n 二維數組 Amn,下面我們看按元素的下標求其地址的計算:
以“以行為主序”的分配為例:設數組的基址為 LOC(a11),每個數組元素占據 d 個地址單 元,那么 aij 的物理地址可用一線性尋址函數計算:
LOC(aij) = LOC(a11) + ( (i-1)*n + j-1 ) * d
這是因為數組元素 aij的前面有 i-1 行,每一行的元素個數為 n,在第 i 行中它的前面還有 j-1 個數組元素。
在 C 語言中,數組中每一維的下界定義為 0,則: LOC(aij) = LOC(a00) + ( i*n + j ) * d 推廣到一般的二維數組:A[c1...d1][c2...d2],則 aij的物理地址計算函數為:
LOC(aij)=LOC(a c1 c2)+( (i- c1) *( d2 - c2 + 1)+ (j- c2) )d
規律分布特殊矩陣的壓縮存儲
規律分布的特殊矩陣
元素分布具有一定規律的矩陣稱為規律分布的特殊矩陣,如三角矩陣(方陣的上或下三 角全為零)和帶狀矩陣(若干條對角線含有非零元)。這類矩陣中元素分布的規律可以用數學公 式來反映。已知二維矩陣 A 中元素下標 i 和 j,作為轉換函數 f 的自變量,計算出到一維內存空 間的地址值 K,即 A i=B[ K],實現了原二維矩陣到壓縮存儲后的一維數組的存儲映射。
1 .三角矩陣
三角矩陣大體分為三類:下三角矩陣、上三角矩陣、對稱矩陣。對於一個 n 階矩陣 A 來 說:若當 i <j 時,有 a ij =c(典型情況 c=0 ),則稱此矩陣為下三角矩陣;若當 i>j 時,有 aij =c(典型情 況 c=0 ),則稱此矩陣為上三角矩陣;若矩陣中的所有元素均滿足 aij =aji,則稱此矩陣為對稱矩 陣。
2 .帶狀矩陣
( 1 )帶狀矩陣描述:在矩陣中的所有非零元素都集中在以主對角線為中心的帶狀區域中。
( 2 )三對角帶狀矩陣特點
( 3 )三對角帶狀矩陣壓縮存儲方法
三對角帶狀矩陣的壓縮存儲原則為:將帶狀區域上的非零元素按行序存儲。
其壓縮存儲方法如下:
①確定存儲該矩陣所需的一維向量空間的大小 假設每個非零元素所占空間的大小為 size 個單元。從圖 3 中觀察得知,在三對角帶狀矩 陣中,除了第一行和最后一行只有2個非零元素外,其余各行均有3個非零元素,由此得到:所需 一維向量空間的大小為: 2 +2 +3 ×( n -2 )= 3 n-2 。
②確定非零元素在一維數組空間中的地址 Loc ( A i)= Loc ( A 1 )+(前 i-1 行非零元素個數+第 i 行中 aij 前非零元素個 數)*size 前 i-1 行元素個數=3 ×( i-1 )- 1 (因為第 1 行只有 2 個非零元素); 第 i 行中 ai j 前非零元素個數=j-i +1 ,其中
由此得到: Loc ( A i)= Loc( A 1 )+( 3 ( i-1 )- 1 +j-i +1)size = Loc( A 1 )+( 2 ( i-1 )+ j -1)size