多維,生活就是多個維度 (被揍),根據維度多寡,又可以分 1 維、2 維、3 維與 N 維,而什麼是維度呢?
一維
是指一條線,像是一體成型的汽車或冰箱,陣列適合存放固定數量的資料,且可以透過索引快速存取。
1. 可以用來儲存一群相同類型的資料
盒子可以拿來裝保健食品,保健食品就是一種類型 (不會拿去裝安眠藥、感冒藥,誤食可能會影響上班狀態)
2. 會使用一段連續的記憶體空間來存放
有一排連續的格子可以提供空間來存放保健食品
3. 必須明確定義要存放多少數量的資料
總共有 7 格,分別可以 7 種保健食品 (如果數量隨時都會有增有減,無法明確定義的話,那會推薦改用其他種資料結構,後續會介紹)
4. 可透過索引快速存取資料
如果今天是週一,就可以直接找到寫著週一的格子,直接把保健品全部吃掉就可以了,不用像傳統作法,可能會帶 7 大罐保建食品去公司的抽屜放,抽屜還亂七八糟,吃的時候還要花心思找 XD
5. 不方便做記憶體空間的追加與刪除
如果吃了一段時間,想要調整保健品的順序,例如週一要改吃維他命 C,週五改吃 B 群,那會發現,整個盒子的內容物可能需要大搬風,或者要將保健食品拿出來並做一些調整,十分麻煩,如下表,全部的保健品都要全部拿出來重放了
當盒子太小
當今天想在多吃一些新的保健食品,但盒子只有 7 個格子,也會有大麻煩,由於盒子在開發製造的時候,就一體成形,可能只能買新的盒子了
當盒子太大
如果今天想要換成 6 格,就會比較麻煩,那要看能不能把多的格子拿鋸子鋸掉 XD,不然多那一格放著不用也是顯得浪費或是占空間,亦或是在買一個新的盒子內含 6 格,不論如何,就是不方便!
二維
是指一個平面,像棋盤是由直線跟橫線所組成的格子
或是像經度與緯度,可以用來記錄颱風的移動路徑
三維
三維是指一個立方體,基於二維平面上,再加上高度的話,就會有長、寬與高 `,三個維度,比如說:3 X 3 X 3 的魔術方塊
或是像三維座標會包含:X軸、Y軸與Z軸,或者像經度與緯度再加上一個海拔高度,也是三維空間
N 維
參考愛因斯坦的相關理論,可能就是三維空間再加上了時間的概念,也許是昨天中午我在辦公室跟大家吃飯,但今天中午在辦公室趕案子沒有吃飯,依樣是待在辦公室,但不同的時間點,可能會有不同的情境發生,而在現實中活中,是如何紀錄每一個空間與時間下發生什麼事情,
二維陣列 Two-Dimensional Array
如果小美吃了一段時間之後,發現每天只吃一種保健食品,好像營養不夠平均,於是他想規劃一週每一天的早上、中午與下午都要吃不一樣的保健食品,昨天的盒子肯定無法滿足他新的需求,這下想必小美要購入新的盒子了。
那小美要添購什麼樣的盒子,才能符合他的需求?因為小美須要根據今天是星期幾以及今天是什麼時段,才能決定要做什麼樣的安排,所以表示小美必須考慮兩個維度的事情星期與時段?
- 吃保健食品有
3 個時段:上午、中午與下午 - 一星期有
7 天, 3 個時段 * 7 天 = 21 格
所以我們可以得知,小美必須購買 21 格的盒子才符合他的需求
- 需要 3 列 Row (每天有 3 個時段)
- 需要 7 行 Column (一週 7 天)
- 會得到
3 * 7 的二維陣列,得到 21 個記憶體空間
var box = new string[3,7] { //會得到 3 * 7 共 21 個記憶體空間
//↓週一~週日
{"維他命D","葉黃素","蔓越莓錠","B群","綜合維他命","益生菌","維他命C"}, //上午
{"葉黃素","蔓越莓錠","B群","綜合維他命","益生菌","維他命C","維他命D"}, //中午
{"蔓越莓錠","B群","綜合維他命","益生菌","維他命C","維他命D","葉黃素"}}; //下午
如果想了解小美禮拜六下午吃什麼?就可以存取 box[時段索引號, 星期索引號],即為 box[2,5],就可以得知小美吃的是維他命D,要記得陣列的索引都是從 0 開始哦!如果不清楚,可以參考上圖表格的橘色框框有標上索引編號
其實二維陣列使用的方式,跟建立 Word 表格的欄與行有點相似,在建立的時候就要清楚地給予欄 Column 與列 Row 的數值才能建立表格
而在實務上,也可以使用二維陣列來計算矩陣相加與相乘,或是可以統計玩家手上的撲克牌,像是可以宣告 4 種花色 * 13 種點數 = 共 52 個空間來記憶
var cards = new int[4,13]
三維陣列 Three-Dimensional Array
如果今天小美,他覺得每週都要分配一次保健品很麻煩,他想要將一個月份,共 4 週的藥品,全部都放好,想必... 他又要買盒子了,因為目前盒子只能裝一週的分量,這次小美可能要換買箱子才可以了
宣告陣列,先盤點需要多少空間:
- 一個月有 4 週
- 每天有 3 個時段
- 一週 7 天
會得到 4 * 3 * 7 的三維陣列
var box = new string[4,3,7] {
{//第一週,索引0
{"維他命D","葉黃素","蔓越莓錠","B群","綜合維他命","益生菌","維他命C"}, //早上
{"葉黃素","蔓越莓錠","B群","綜合維他命","益生菌","維他命C","維他命D"}, //中午
{"蔓越莓錠","B群","綜合維他命","益生菌","維他命C","維他命D","葉黃素"} //下午
},
{//第二週,索引1
{"維他命D","益生菌","蔓越莓錠","B群","綜合維他命","葉黃素","維他命C"}, //早上
{"維他命C","蔓越莓錠","B群","綜合維他命","益生菌","葉黃素","維他命D"}, //中午
{"維他命D","綜合維他命","B群","益生菌","維他命C","蔓越莓錠","葉黃素"} //下午
},
{//第三週,索引2
{"維他命D","葉黃素","蔓越莓錠","B群","綜合維他命","益生菌","維他命C"}, //早上
{"葉黃素","蔓越莓錠","B群","綜合維他命","益生菌","維他命C","維他命D"}, //中午
{"蔓越莓錠","B群","綜合維他命","益生菌","維他命C","維他命D","葉黃素"} //下午
},
{//第四週,索引3
//週一索引0, 週2索引1,以此類推,週日索引6
{"維他命D","葉黃素","蔓越莓錠","B群","綜合維他命","益生菌","維他命C"}, //早上 0
{"葉黃素","益生菌","B群","綜合維他命","蔓越莓錠","維他命C","維他命D"}, //中午 1
{"蔓越莓錠","B群","葉黃素","益生菌","維他命C","維他命D","綜合維他命"} //下午 2
}};
如果想知道小美吃什麼,就可以使用程式碼 box[週次索引號, 時段索引號, 星期索引號] 去查詢,比如第 4 週,禮拜天,晚上吃什麼,可呼叫 box[3,2,6],即可得知吃的是綜合維他命 實際應用的話,可以用於記錄學生的月考分數,盤點維度:
- 多位學生
- 多個考試科目
- 多個月份
N 維陣列 N-Dimensional Array
一樣的例子在堆疊上去
記錄學生高一到高三的月考分數,盤點維度:
- 多位學生
- 多個考試科目
- 多個月份
- 多個年度
這樣就是 4 維陣列囉