學習數據結構--第三章:棧和隊列(特殊矩陣的壓縮存儲)

特殊矩陣的壓縮存儲

1.矩陣


在C語言中,我們通常使用二維數組來存儲矩陣。

2.矩陣的壓縮存儲

比如我們要將下面的學生信息通過一個3行6列的矩陣存儲起來,但是所有的學生的信息都是一樣的,所以我們其實只用存儲一個就行了。

下面的信息,每一行信息都是一樣的,按照上述壓縮方式我們只需三個存儲單元就可以存放該矩陣的所有信息了。

  • 壓縮存儲:指多個值相同的元素只分配一個存儲空間,對零元素不分配存儲空間。
  • 特殊矩陣:指具有許多相同矩陣元素或零元素,並且這些相同矩陣元素或零元素的分佈有一定規律性的矩陣。
  • 特殊矩陣的壓縮存儲:找出特殊矩陣中值相同的矩陣元素的分佈規律,把那些呈現規律性分佈、值相同的多個矩陣元素壓縮存儲到一個存儲空間上。

只有特殊矩陣才能壓縮存儲。

3.特殊矩陣的壓縮存儲

3.1對稱矩陣

對稱矩陣: 若對一個n階方陣A[1...n][1....n][中的任意元素aij都有aij=aji(1 ≤ i, j ≤ n),則稱其爲對稱矩陣。

如下圖:

在矩陣中我們常把矩陣化成三個區域:

  • i > j 下三角區域
  • i = j 主對角線
  • i < j 上三角區域

根據此矩陣的特點我們發現,我們只需存儲:下三角區域主對角線區域;原先我們的數組爲A[n][n] ,現在我們只需要B[n(n+1)/2]個存儲單元就行了,這就達到壓縮的目的了。

這個 n(n+1)/2 是通過等差數列求和得到的,第一行一個元素,第二行兩個元素,第三行三個元素…

具體存放順序:

現在思考:壓縮存儲的數組中aij的下標爲?

答案:k=[i(i-1)/2] + j-1

分析:第 i j 個元素的前 i-1 行元素的總個數爲:1,2,3,4,5…i-1 個,等差數列求和:i(i-1)/2個,另外,第i行我們有j個元素,故再加上j,最後我們求得是下標,所以減去一個1,故答案:k=[i(i-1)/2] + j-1

注意我們假設這裏的B數組下標從0開始

3.2三角矩陣

三角矩陣: 若對一個n階方陣A[1...n][1...n] 上(下)三角區元素均爲同一常量,則稱爲(上)三角矩陣。

壓縮存儲的數組B[[n/(n+1)/2]+1] ,這裏的n(n+1)/2和上面的對稱矩陣是一樣,至於這個+1是因爲,我們要將這個相同的常量C存放在該數組B的最後一個存儲單元上。

下三角矩陣

按行優先存儲

上三角矩陣

按行優先存儲

注意我們假設這裏的B數組下標從0開始

3.3三對角矩陣

三對角矩陣 若對一個n階方陣A中的任意元素aij,當|i-j|>1,有aij=0(1<=i,j<=n),則稱爲三對角矩陣。

其實就是除了主對角線的元素和兩側的元素之外,其他元素的值都等於0,就稱爲 三對角矩陣

三對角矩陣壓縮存儲依然按行優先存儲

現在思考:壓縮存儲的數組中aij的下標爲?

注意我們假設這裏的B數組下標從0開始

答案:k=3(i-1)-1+ j-(i-1)+1 -1 = 2i+j-3

若已知 k,求 i,j?

答案:

  • i=[(k+1)/3+1]
  • j= k-2i+3

解釋:k+1 表示數組下標從0開始,我們求得是i,所以要加1, 然後除以三,代表有多少個元素爲三個的整行,然後我們知道第一行元素只有兩個,然後我們從第i行中拿一個補到第一行當中,那麼在第i行中元素個數永遠不會爲3個了,所以加1然後去下界,就得到了行號。

注意:這裏的 [ ] 不再代表括號,而是代表求整函數,例如:[4/3] = 1,[8/3]=2

3.4稀疏矩陣

稀疏矩陣: 矩陣元素個數s相對於矩陣中非零元素的個數t來說非常多,即 s>>t 的矩陣稱爲稀疏矩陣。

這裏說的非常多是一個模糊的概念。下面使用 三元組存儲。


我們使用三元組來壓縮存儲稀疏矩陣,稀疏矩陣壓縮存儲後失去了隨機存儲的特性。

4.特殊矩陣數組

數組 是由n(n>=1)個相同類型的數據元素構成的有限序列,每個數據元素稱爲一個數組元素,每個元素受n個線性關係的約束,每個元素在n個線性關係中的序號稱爲該元素的下標,並稱該數組爲n維數組。

數組是線性表的推廣!

4.1數組的維度

數組是具有維度的

在這裏插入圖片描述

4.2數組的維度和維界不可變

數組一旦被定義,其維度和維不可變,數組除初始化和銷燬外,只有存取元素和修改元素的操作

4.3數組的存儲結構

採用順序存儲,是一個塊連續的存儲空間。

在這裏插入圖片描述

二維數組存儲順序
按行優先
在這裏插入圖片描述

LOC(a00)代表第一個元素的地址,然後L是每個元素的大小,(n+1)代表每一行從0nn+1一個元素,i*(n+1)*L中的i是因爲第 i 行,從0-到 i-1i 行,所以乘以 i ,後面加上 j*:L是因爲第aij,代表第i+1行的第j個元素,所以加上這些元素的地。

按列優先

在這裏插入圖片描述

LOC(a00)代表第一個元素的地址,按列優先,首先要加上前0----(j-1)列的的地址空間:j*(n+1)*L ,然後加上第j列此元素上面的空間,總共0----(i-1)個元素即爲i個,故:i*L

歡迎關注公衆號理木客,堅持原創知識分享,更多精彩等你發現,期待你的關注
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章