陣列是由型別相同的資料元素構成的有序集合,每個資料元素稱為乙個陣列元素,每個元素受(n>=1)個線性關係的的約束,每個元素在n個線性關係中的序號i1,i2...in稱為該元素的下標,並稱該陣列為n維陣列.
陣列的儲存結構與定址
由於陣列一般要求實現隨機訪問,所以一般採用順序儲存結構.由於記憶體單元是一維,而多維陣列是多維的結構,所以採用順序儲存結構儲存陣列首先需要將多維結構對映到一維結構中.二維陣列的每個元素含有兩個下標,需要將其對映為一維關係。通常有兩種對映方式:按行儲存和按列儲存.
c++是按行優先儲存的.
設二維陣列行下標和列下標分別為閉區間[l1, h1],[l2,h2];則按行優先儲存的任意一元素aij的位址可以用以下公式計算:loc(aij) = loc(al1l2) + ((i-l1)*(h2-l2+1) + (j-l2))*c
行下標[0,2] 列下標[0,3]
根據上述公式a[2][3] = a + 2*4 + 3
按行儲存的基本思想是,最右邊的下標最先變化.
二維陣列用定址方式展示:
int a[4] = ,,};
for (int i = 0; i<3; i++) // 行下標
printf("\r\n");
}特殊矩陣的壓縮儲存:
1.對稱矩陣:在乙個n階方陣中,有aij = aji(i>=0, j<=n-1)
else
*((int*)array + i*n + j) = compress[k];
} }}測試例子: int symarray[5][5] = ,,,,}; printf("對稱矩陣:\r\n");
for (int i = 0; i<5; i++)
printf("\r\n");
} printf("將其壓縮後:\r\n");
int compress[15] = ;
compresssymmatrix((int**)symarray, 5, compress);
for (int i = 0; i<15; i++)
printf("將其解壓後:\r\n");
int dearray[5][5] = ;
decompresssymmatrix(compress, 5, (int**)dearray);
for (int i = 0; i<5; i++)
printf("\r\n"); }2.三角矩陣
if ((!bup) && (i<=j))
}} if (bup)
else
}// 將壓縮的下三角矩陣解壓出來
// int** array 解壓後的三角矩陣
// n n階矩陣
// compress 壓縮的一維陣列
// bup = true 上三角矩陣 bup = false 下三角矩陣
void decompress********(int** array, int n, int compress, bool bup = true)
else
}else
else
}*((int*)array + i*n + j) = compress[k];
} }}int uptriarray[5] = , ,,,};
int downtriarray[5] = ,,,,}; printf("下三角矩陣:\r\n");
for (int i = 0; i<5; i++)
printf("\r\n");
} printf("將其壓縮後:\r\n");
int compress[16] = ;
compress********((int**)downtriarray, 5, compress, false);
for (int i = 0; i<16; i++)
printf("將其解壓後:\r\n");
int dearray[5][5] = ;
decompress********((int**)dearray, 5, compress, false);
for (int i = 0; i<5; i++)
printf("\r\n");
}上三角矩陣的測試稍微改一下上面部分即可.
3.對角矩陣:
對角矩陣:在對角矩陣中,所有非0元素都集中在以主對角線為中心的帶狀區域中,除了主對角線和它的上下方若干條對角
線的元素外,其他元素都為0.
將乙個m*n的w對角矩陣(w是占有非0元素對角線的個數,也成為頻寬).壓縮到m行,w列的二維陣列b中.則aij與bts的對映關係
為:t = i; s = j - i + 1
// 入參: int** array 要壓縮的對角矩陣
// m,n,w m行n列頻寬w
// outarray 壓縮後的矩陣
void compressdiagonalmartix(int** array, int m, int n, int w, int** outarray)
else
}}}測試: int diagonalarray[5][5] = ,,,,};
int compressdiagonalarray[5][3] = ; printf("對角矩陣:\r\n");
for (int i = 0; i<5; i++)
printf("\r\n");
} printf("將其壓縮後:\r\n");
//int compress[16] = ;
compressdiagonalmartix((int**)diagonalarray, 5, 5, 3, (int**)compressdiagonalarray);
for (int i = 0; i<5; i++)
printf("\r\n");
} printf("將其解壓後:\r\n");
int dearray[5][5] = ;
decompressdiagonalmartix((int**)dearray, 5, 5, 3, (int**)compressdiagonalarray);
for (int i = 0; i<5; i++)
printf("\r\n");
}對角矩陣另一種儲存方法是壓縮到一維陣列中,按行儲存非0元素,k = 2i+j;
4. 稀疏矩陣的壓縮儲存
稀疏矩陣的壓縮儲存
稀疏矩陣是0元素居多的矩陣.
1.對於稀疏矩陣,0元素分布沒有規律.僅儲存非0元素是沒有用的,還要儲存元素的行號和列號.
即每個非0元素可以表示成如下三元組
template
struct element
;三元組順序表,為了確定乙個唯一稀疏矩陣,還要儲存稀疏矩陣的行數,列數和非0元素的個數const int maxterm = 256;
template
struct sparsematrix
;// 稀疏矩陣壓縮儲存
// 入參:int** array要壓縮的稀疏矩陣
// m,nm行n列
// 出參:sparsematrix& 輸出儲存的結構
void compresssparematrix(int** array, int m, int n, sparsematrix& sparematrix)
} }sparematrix.notzerocount = ncount;
sparematrix.rowcount = m;
sparematrix.colcount = n;
}// 稀疏矩陣對三元組順序表的轉置
// 1)直接取,順序存
// 描述:依次從a矩陣尋找0,1..n-1列的三元組,找到之後交換行列位置存入b中.
void trans1(sparsematrix& sparsematrixa, sparsematrix& sparsematrixb)
{ sparsematrixb.colcount = sparsematrixa.rowcount;
sparsematrixb.rowcount = sparsematrixa.colcount;
sparsematrixb.notzerocount = sparsematrixa.notzerocount;
int pb = 0;
if (sparsematrixa.notzerocount > 0)
{ for (int col = 0; col < sparsematrixa.colcount; col++)
{ for (int notzero = 0; notzero
陣列的壓縮儲存(特殊矩陣 稀疏矩陣)
其實這裡就不應該說是陣列了,而應該是說行列式,對稱矩陣 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 這時看對角線比較舒服,可以看出...
特殊矩陣的壓縮儲存
特殊矩陣的主要形式有 1 對稱矩陣 2 上三角矩陣 下三角矩陣 3 對角矩陣 它們都是方陣,即行數和列數相同。一 對稱矩陣的壓縮儲存 若乙個n階方陣a n n 中的元素滿足a i,j a j,i 0 i,j n 1 則稱其為n階對稱矩陣。由於對稱矩陣中的元素關於主對角線對稱,因此在儲存時可只儲存對稱...
特殊矩陣的壓縮儲存
壓縮儲存 指多個值相同的元素只分配乙個儲存空間,對零元素不分配儲存空間。特殊矩陣 指具有許多相同矩陣元素或零元素,並且這些相同矩陣元素或零元素的分布有一定規律性的矩陣。特殊矩陣的壓縮儲存 找出特殊矩陣中值相同的矩陣元素的分布規律,把那些呈現規律性分布 值相同的多個矩陣元素壓縮儲存到乙個儲存空間上。若...