其實這裡就不應該說是陣列了,而應該是說行列式,
對稱矩陣:a[i][j]=a[j][i]
上下三角行列式:對角線以下/以上的元素均為0
帶狀行列式:這個可能不太好理解,舉乙個例子
1 1 0 0 0
1 1 1 0 0
0 1 1 1 0
0 0 1 1 1
0 0 0 1 1
這時看對角線比較舒服,可以看出來有三條斜著的線上的元素是aij(例子裡面均是1),而剩下的是0.
介紹乙個名詞,頻寬,就是帶狀行列式的寬度,為第一行非零元格個數減一,記為s。
因為上述矩陣的特點(宣告一下,行列式也可以看成矩陣,至少在我學習的範圍內,含義上可能有所不同,但並不影響對這部分知識的闡述),這些矩陣都可以只儲存非零元,或者是對稱部分的一半,這樣就可以節約很多的空間。
採取一元矩陣的結構,這樣每一種應該怎麼放置呢?
對稱陣:a[i][j]
如果i>=j,應該為一元陣列的b[ i*(i+1)/2 + j ];
如果i對稱陣這裡有乙個細節哈,就是按照上三角和下三角儲存的一維陣列順序不一樣,上述公式是上三角按行儲存的,如果需要下三角按行儲存,按照相同的原理推一下就行。
上三角:
i>j的直接為0;
i<=j的b[ i*(i+1)/2 + j ];
下三角:
i>=j 時 b[ i*(i+1)/2 + j ];
i帶狀矩陣:
|i-j|<=s,b[2s*i+j] (s為前面提到的頻寬)
其實上下三角的問題(包括對稱),是按照行來儲存,也可以按照列,對稱陣裡面也是上下三角儲存均可,上述只是一種方式,並不唯一,如果實際操作還是建議按照自己舒服的方式來,現場推導一下。
乙個二維陣列的非零元個數遠少於零元個數且無序分布的時候。
一般的限定為非零元個數比例少於5%
方法一:三元組儲存
struct three
;
一般用這樣乙個三元組儲存。
只需要乙個結構體陣列即可。
方法二:十字鍊錶
這樣的結構體
struct three
int row,col;
//行列資訊
int value;
//數值資訊
struct three *left,
*up;
//兩個指標
這個指標是怎麼用的?
沒錯,用來連線整個鍊錶的(十字表)
結構:需要兩個結構體陣列,
乙個長度為行數,列值初始化為-1,up指標為空,left指標初始化指向自己。
另乙個長度為列數,行初始化為-1,left指標為空,up指標初始化指向自己。
每插入乙個點,需要匹配行列陣列上的結構體,將left指標指向對應行的結構體,並將行的left指標指向該節點,保證構成環,列同理;
如果之前該行或者該列有元素,按照環形鍊錶的方式處理即可。
就這樣,每一行每一列都是乙個環形鍊錶。
上述圖案對應的矩陣。
說明一下,正常情況看left和up指標可能很彆扭,你也可以換成向右和向下的指標,只要知道是使用兩個指標連線整個十字鍊錶就行了,另外我在其他部落格上也看到了不構成環形鍊錶的,但是看得出來思想都是一樣的,具體細節完全可以看個人的習慣。
對稱矩陣 稀疏矩陣的壓縮儲存
對稱矩陣 稀疏矩陣的壓縮儲存 1 對稱矩陣的壓縮儲存 對稱矩陣顧名思義就是符合行和列的個數相同,並且矩陣中儲存的資料上三角和下三角中對應位置上的元素值是相等的。為了能夠減少儲存的空間,我們可以只儲存上三角矩陣 或者下三角矩陣中的元素,這樣就能夠極大地節省空間的浪費。下面是對稱矩陣的示列 假設對稱矩陣...
稀疏矩陣的壓縮儲存
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...