# [資料結構] CH3. Arrays * 陣列是連續的儲存空間,它會有一個索引(index)對應到一個資料(data)。 * 在C++中,索引從`0`開始。 * 下圖是個陣列A的範例: * A[0]=5, A[3]=4, A[4]=26 ```graphviz digraph Array { label="陣列A" node[shape=record] store1 [label="<f0> \<0,5\>|<f1> \<1,8\>|<f2>\<2,3\>|<f3>\<3,4\>|<f4>\<4,26\>"]; } ``` * 因為在記憶體中,陣列是連續的空間,我們便可以利用指標來尋找我們要的地方。 * 假設有一指標`p`指向陣列A的頭,而陣列A一格的資料大小是`d`,我們可以說: * A[0]的位置是p。 * A[4]的位置是p+4d。 * 上面那種題目在這邊頗愛考,給你p和d,要你求某位置的表示法等等。 * 在接下來的2D或是三角矩陣都會要你求,等等會介紹。 ## 2D Array * 2D Array稱作**二維陣列**,有時候我們直接叫做**矩陣**。 * 假設今天有個矩陣A:$A=\begin{bmatrix}1 &5 &9 \\ 2 &6 &10 \\ 3 &7 &11 \\ 4 &8 &12 \end{bmatrix}$ * 該矩陣的row數(直排數)為4,column數(橫列數)為3。 * $A_{i,j}$表示矩陣中第`i` row,第`j` column的值。 * 由於C++是從0開始,因此$A_{1,1}$是A[0][0]=1;$A_{3,2}$=A[2][1]=7。 `特別注意下面的所有式子到底是Aij還是A[i][j],切記不要搞混!!` * 前面說過,陣列是連續的空間。在二維中根據連接方式不同,分為`Row-major`和`Column-major`。 * C++中預設的二維都是Row-major,我個人不知道有沒有辦法更改。 ### Row-major * 同樣以上面的矩陣$A=\begin{bmatrix}1 &5 &9 \\ 2 &6 &10 \\ 3 &7 &11 \\ 4 &8 &12 \end{bmatrix}$來舉例,當A是個Row-major的矩陣時,代表它在記憶體中儲存的順序是: ```graphviz digraph Array { node[shape=record] store1 [label="<f0>1 |<f1>5 |<f2>9|<f3>2|<f4>6|<f5>10|<f6>..."]; } ``` * 因此同樣可以利用指標來找元素: * `p`是指向開頭的指標,`i`是元素的row,`j`是元素的column,`c`是陣列的總column,`d`是每格的大小。 * A[i][j]=p+((i)*c+(j))*d. * A[2][1]=p+(2*3+1)*d = p+7d = 7 ### Column-major * 同樣以上面的矩陣$A=\begin{bmatrix}1 &5 &9 \\ 2 &6 &10 \\ 3 &7 &11 \\ 4 &8 &12 \end{bmatrix}$來舉例,當A是個Column-major的矩陣時,代表它在記憶體中儲存的順序是: ```graphviz digraph Array { node[shape=record] store1 [label="<f0>1 |<f1>2|<f2>3|<f3>4|<f4>5|<f5>6|<f6>..."]; } ``` * 當然,同樣可以利用指標來找元素: * `p`是指向開頭的指標,`i`是元素的row,`j`是元素的column,`r`是陣列的總row,`d`是每格的大小。 * A[i][j]=p+((j)*r+(i))*d. * A[2][1]=p+(1*4+2)*d = p+6d = 7 #### 練習 * 已知一個矩陣A,$A_{3,2}$的記憶體位置為1110,$A_{2,3}$的位置是1115,每個空間大小為1,請問 - a) 此矩陣是Row-major還是Column-major? - b) 此矩陣的開頭指標應為哪個位置? - c) $A_{5,4}$的位置在哪裡? * 答案請反白 * <p><font color="#FFFFFF">Column-major</font></p> * <p><font color="#FFFFFF">1102</font></p> * <p><font color="#FFFFFF">1124</font></p> ## Lower-Triangular Matrix * Lower-Triangular Matrix(下三角矩陣),$A_{i,j}=0$, when $i<j$,且必定為方陣。 * ![](https://i.imgur.com/yi57XgK.png) * 在Row-major和Column-major的情形下都可推導出公式: * Row-major: $Location(A_{i,j})=l_s+[\frac{i*(i-1)}{2}+j-1]*d$。 * Column-major: $Location(A_{i,j})=l_s+[i+n*(j-1)-\frac{j*(j-1)}{2}-1]*d$。 ## Upper-Triangular Matrix * 其實就反過來,$A_{i,j}=0$, when $i>j$,且必定為方陣。 * ![](https://i.imgur.com/yHRmhBN.png) * 也一樣可以推導公式: * Row-major: $Location(A_{i,j})=l_s+[\frac{j*(j+1)}{2}+i-1]*d$。 * Column-major: $Location(A_{i,j})=l_s+[j+n*(i-1)-\frac{i*(i-1)}{2}-1]*d$。 ###### tags: `DS` `note`