對稱矩陣,相信大家都有所了解,即元素為以主對角線為對稱軸對應相等的矩陣。故而會有許多相等的元素。 這種矩陣如果很大,存儲時必然會浪費很多空間,本文講解對稱矩陣的壓縮存儲。 以如下4*4對稱矩陣為例: 本文考慮只存儲對稱矩陣的下三角元素(上三角同樣可行),即下圖灰色部分
那么很顯然,我們可以將這樣一個對稱矩陣壓縮存儲到一個一元數組中,從而節省較多的空間,接下來我們分析一下如何存儲。 分析:第一行有一個元素,第二行有兩個元素……第i行有i個元素…… 若對稱矩陣是n*n的,則我們需要一個長度為1+2+…+n的數組來依次存儲每行元素,由如下的等差數列前n項和公式:
計算n*n的數組壓縮存儲時所需空間,求得:
以以上矩陣為例,我們需要一個長度為10的數組b來存儲原數組a的所有下三角元素,接下來我們分析如何根據下標i,j獲取到我們需要的那個數字。如根據2,1獲取到下圖中紅框框住的元素2:
分析:首先,由于我們只存儲了下三角元素,故而在接收到ij時需進行判斷,若i≤j即為上三角的值,需swap(i,j)使得i≥j(因為矩陣是對稱的); 保證ij為下三角的下標后,觀察數組a。 第一行的元素1將存在數組b的第一個位置上, 第二行的兩個元素3、-6將存在數組b的第二、三個位置上 …… 第i行的i個元素將存在數組b的第1+2+…+(i-1)+1個位置上, 即前i-1行元素的個數(第x行有x個元素)+1,存儲形式如下圖所示:
那么現在我們用C++的模板實現對稱矩陣的壓縮存儲。 成員變量應有T類型的指針_a,原數組(n*n)大小_n; 成員函數除去構造、析構函數,為了防止淺拷貝,應寫出拷貝構造、賦值運算符重載、打印數組函數以及獲取ij下標對應元素的函數。 代碼如下:
本博文若有何錯誤不足之處,歡迎大家一起交流或批評指正! 喜歡的朋友請點贊噢n(≧▽≦)n?。?/p>
新聞熱點
疑難解答