【數據結構&算法】二:上三角、下三角中求數組地址--【下標的計算】

一.三角矩陣的概念

以主對角線劃分三角矩陣有下三角矩陣和上三角矩陣

下三角矩陣:矩陣(除主對角線)的上三角部分的值均爲一個常數C或者0

上三角矩陣:與下三角矩陣相反

圖示:(圖中藍色主對角線部分元素(一般情況)永遠不都爲一個常數或者0)

二.壓縮原理
根據上、下三角矩陣的特殊性(有一小半部分的元素都爲一個常數C或者0)我們可以考慮將這一半的空間壓縮到一個元素(多對一的映射),然後另一半的部分就類似對稱矩陣一半部分的壓縮存儲了。

三.矩陣座標[i,j]轉換爲一維數組下標K的方法
1>下三角矩陣:

(1).首先考慮,非重複部分的存儲,見圖:

可以得出k = i(i-1)/2+j-1 (推導過程可以參考:對稱矩陣的壓縮

(2).重複部分只需一個元素即可,爲不影響前面的存儲,考慮放到所有非重複元素的後面即可, 由於前面部分總共的元素個數爲:

n(1+n)/2(等差數列求和,每行元素逐級遞增)又由於數組以0爲起點,所以放到n(1+n)/2的位置即可。

總結:
k = i(i-1)/2+j-1 (i<=j)  
k = n(n+1)/2 (i>j)   
2>上三角矩陣

(1).先考慮非重複部分的存儲,圖示:

  

 

按行優先存儲,矩陣中元素對應一維數組的元素規則爲:

由圖顯而易見,某元素在一維數組中的下標就是它按行優先存儲時在半個矩陣中的序號

(1-1)序號 = 所有在它前面元素的個數 = 它所在行前面行的所有元素+它所在行它前面的元素

由於每行元素個數逐級遞減,構成一個等差數列,公差:d = 1,首項:a1 = n ,末項:an = n-(i-1) = n-i+1(經評論區提醒,已自糾)

(1-2)前i-1行元素個數爲:sn = n(a1+an)/2 = (i-1){n+[n-(i-1)+1]}/2=(i-1)(2n-i+2)/2  

(1-3)第i行中在它前面的元素個數爲:j-1

(1-4)公式:K =(i-1)(2n-i+2)/2+j-1

(2).考慮重複部分元素和下三角一樣:k = n(n+1)/2

總結:
K = (i-1)(2n-i+2)/2+j-1(i<=j)
K = n(n+1)/2 (i>j)
————————————————


原文鏈接:https://blog.csdn.net/SWEENEY_HE/article/details/85956176

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