5 4稀疏矩陣壓縮儲存下

2021-10-06 14:35:23 字數 2688 閱讀 4136

方法二:「一次定位快速轉置」法

演算法思想

在方法一中,為了使轉置後矩陣的三元組表 b 仍按「行序遞增」存放,必須 多次掃瞄被轉置矩陣的三元組表 a,以保證按被轉置矩陣列序遞增進行轉置。因此要通過雙 重迴圈來完成。改善演算法的時間效能,必須去掉雙重迴圈,使整個轉置過程通過一重迴圈來完成,即只對被轉置矩陣的三元組表 a 掃瞄一次,就使 a 中所有非零元的三元組「一次定位」直接放到三元組表 b 的正確位置上。

為了能將被轉置三元組表a 中的元素一次定位到三元組表b的正確位置上,需要預先計算以下資料:

為此,需要設兩個陣列分別為 num和 position。其中 num[ col]用來存放三元組表 a 第 col 列中非零元素總個數(三元組表 b 第 col 行中非零元素的總個數)。 position[ col]用來存放轉置前三元組表 a 中第 col 列(轉置後三元組表 b 中第 col 行)中第乙個非零元素在三元組表 b 中的儲存位置(下標值)。

num[ col]的計算方法:將三元組表a掃瞄一遍,對於其中列號為col的元素,給相應的num 陣列中下標為 col 的元素加 1

說明:在 num[ col]的計算中,採用了「陣列下標計數法」。

position[ col]的計算方法:

① position[ 1 ]=1 ,表示三元組表a 中,列值為 1的第乙個非零元素在三元組表b 中的下標值;

② position[ col]=position[ col-1 ]+num[ col-1 ]。其中 2 ≤ col≤ a.n。

思考題:選票統計問題。由 10 位候選人參與選舉,編號分別為 1 ,2 ,…, 10 。現有 20 000 張有效選票(選票上均標記 1 ~10 之間的數字表明所選候選人),統計各位候選人的得票數。 說明方法,給出程式

【提示】一次掃瞄 2 萬張選票,利用陣列統計候選人得票數。

「一次定位快速轉置」的具體做法: position[ col]的初值為三元組表 a 中第 col 列(三元 組表 b 的第 col 行)中第乙個非零元素的正確位置,當三元組表 a 中第 col 列有乙個元素加入 到三元組表 b時,則 position[ col]=position[ col]+1 ,即:使 position[ col]始終指向三元組表a中第 col 列中下乙個非零元素在三元組表 b 中的正確存放位置(下標值)。

演算法描述

fasttransposetsmatrix (tsmatrix  a,  tsmatrix  * b)

/*end of for*/

}}

演算法分析

「一次定位快速轉置」演算法的時間主要耗費在 4 個並列的單迴圈上,這 4 個 並列的單迴圈分別執行了a.n,a.len,a.n-1,a.len次,因而總的時間複雜度為o( a.n)+o( a.len)+ o( a.n)+ o( a.len),即為 o( a.n +a.len),當待轉置矩陣 m 中非零元素個數接近於 a.m ×a.n 時,其時間複雜度接近於經典演算法的時間複雜度 o( a.m ×a.n)。

對例子給出的 a 矩陣 a.m=100 ,a.n=500 ,a.len=100 ,採用 「列序「遞增轉置法的時間耗費為 a.n× a.len =50 000 次 。 而採用一次定位快速轉置法的時間耗費為 a.n+a.len+a.n+a.len=1200 次。顯然,「一次定位快速轉置」演算法的時間效率要高得多。在 時間效能上優於遞增轉置法,但在空間耗費上增加了兩個輔助向量空間,即 num[ 1 … a.n],position[ 1 … a.n](本例中為 1000),由此可見,演算法在時間上的節省是以更多的儲存空間為代價的。

與用二維陣列儲存稀疏矩陣相比較,用三元組表表示法的稀疏矩陣不僅節約了空間,而且 使得矩陣某些運算的時間效率優於經典演算法。但是當需進行矩陣加法、減法和乘法等運算時, 有時矩陣中非零元素的位置和個數會發生很大的變化。如 a =a+b,將矩陣 b 加到矩陣 a 上, 此時若用三元組表表示法,勢必會為了保持三元組表「以行序為主序」而大量移動元素。

為了避免大量移動元素,介紹稀疏矩陣的鏈式儲存法———十字鍊錶,它能夠靈活地插入因運算而產生的新的非零元素,刪除因運算而產生的新的零元素,實現矩陣的各種運算。

在十字鍊錶中,矩陣的每乙個非零元素用乙個結點表示,該結點除了( row,col,value)以外, 還要有以下兩個鏈域:

在十字鍊錶中,同一行的非零元素通過 right 域鏈結成乙個單鏈表。同一列的非零元素通 過 down 域鏈結成乙個單鏈表。

這樣,矩陣中任一非零元素 m[ i][ j]所對應的結點既處在第 i 行的行煉表上,又處在第 j 列的列煉表上,這好像是處在乙個十字交叉路口上,所以稱其為十字鍊錶。同時再附設乙個存放所有行鍊錶的頭指標的一維陣列和乙個存放所有列鍊錶的頭指標的一維陣列。

整個十字鍊錶的結構如圖所示。

稀疏矩陣的壓縮儲存

include include using namespace std templateclass sparsematrix sparsematrix 訪問稀疏矩陣中row行col中的元素 t access int row,int col it return invalid for size t i...

稀疏矩陣的壓縮儲存

稀疏矩陣的壓縮儲存 實現稀疏矩陣壓縮儲存,並實現矩陣轉置和求和。輸入矩陣時,首先需要輸入非零元素的個數,然後分別輸入矩陣的 行號,列號和值。輸完2個矩陣後,自動進行計算第乙個矩陣的轉置以及兩個矩陣的和。例如 輸入如下 100 90 5 矩陣的行數為100,列數為90,共5個非零元素。1 10 100...

對稱矩陣 稀疏矩陣的壓縮儲存

對稱矩陣 稀疏矩陣的壓縮儲存 1 對稱矩陣的壓縮儲存 對稱矩陣顧名思義就是符合行和列的個數相同,並且矩陣中儲存的資料上三角和下三角中對應位置上的元素值是相等的。為了能夠減少儲存的空間,我們可以只儲存上三角矩陣 或者下三角矩陣中的元素,這樣就能夠極大地節省空間的浪費。下面是對稱矩陣的示列 假設對稱矩陣...