歡迎來到基礎數據結構!
在你的電腦科學學習之旅中,你已經使用過變數來儲存單一資訊,例如姓名或分數。但如果你需要儲存 100 個學生的姓名,或者西洋棋比賽中的每一步棋呢?建立 100 個不同的變數簡直是場噩夢!這時候,數據結構 (Data Structures) 就能派上用場了。它們讓我們能更有效率地組織和儲存數據。在本章中,我們將會掌握陣列 (Arrays) 和列表 (Lists)。
1. 什麼是數據結構?
簡單來說,數據結構是一種用於組織、處理、檢索和儲存數據的特殊格式。你可以把它想像成「把衣服隨意堆在地板上」與「使用抽屜櫃」之間的區別。有了抽屜(數據結構),找到你需要的東西會變得輕鬆得多!
靜態與動態數據結構
這是 Oxford AQA 課程大綱中的重要概念,讓我們來拆解一下。數據結構通常分為兩大類:
靜態數據結構 (Static Data Structures): 這些結構的大小在程式編譯時就已經確定,且在程式執行期間無法改變大小。
- 類比:學校裡的一排 10 個儲物櫃。你無法突然在牆中間插入第 11 個儲物櫃!
- 優點:訪問速度非常快,因為電腦確切知道它們佔用了多少記憶體。
- 缺點:如果你沒填滿所有位置,可能會浪費空間;如果數據太多,則可能空間不足。
動態數據結構 (Dynamic Data Structures): 這些結構可以在程式執行期間擴大或縮小。
- 類比:手機裡的數位照片相簿。只要還有儲存空間,你就可以一直增加照片。
- 優點:它們只會使用當下需要的記憶體空間。
- 缺點:電腦管理起來稍微複雜一些,這可能會讓它們比靜態結構稍慢一點。
快速回顧:如果你明確知道要儲存多少項目,請使用靜態結構。如果項目數量會變動,動態結構就是你的好幫手!
2. 陣列與列表
在許多程式語言中,陣列是靜態數據結構的經典例子,而列表通常是動態的。
了解陣列
陣列 (Array) 是一個在單一識別碼(名稱)下儲存相同數據類型的一組項目。陣列中的每個項目都稱為元素 (Element)。
要找到特定的元素,我們使用索引 (Index)。關鍵點:在電腦科學中,我們幾乎總是從 0 開始算起,而不是 1!
範例:如果我們有一個名為 Scores 的陣列:[10, 25, 30, 45]
- Scores[0] 是 10
- Scores[1] 是 25
- Scores[3] 是 45
Python 如何處理這個問題
你知道嗎? Python 其實不像 C# 或 Java 那樣內建「靜態陣列」。Python 使用的是列表 (lists),它們是動態的。不過,為了應付考試,你應該知道你可以使用列表來解決需要陣列的問題。如果你在 Python 中特別需要陣列,則必須匯入像 numpy 或 array 這樣的模組。
常見錯誤:嘗試存取不存在的索引。如果陣列有 5 個項目,最後一個索引是 4。嘗試存取索引 5 會導致「索引超出範圍 (Index Out of Range)」的錯誤!
3. 二維 (2D) 陣列
別擔心,這剛開始看起來可能有點棘手!一維陣列就像單排儲物櫃。二維陣列就像一整面牆的儲物櫃,包含行與列。它本質上是陣列的陣列。
類比:將二維陣列想像成一個「電影院座位表」或「試算表」。
要在二維陣列中找到資料,你需要兩個座標:[列][欄] (row/column)。
範例:一個名為 Grid 的二維陣列
[ "A", "B", "C" ]
[ "D", "E", "F" ]
[ "G", "H", "I" ]
- 要取得 "A",我們使用 Grid[0][0]
- 要取得 "F",我們使用 Grid[1][2](第 1 列,第 2 欄)
- 要取得 "G",我們使用 Grid[2][0](第 2 列,第 0 欄)
記憶小撇步:請記住 RC(就像 RC 遙控車)——先 Row (列),後 Column (欄)!
4. 使用陣列與列表
在考試中,你可能會被要求使用迭代 (Iteration)(迴圈)來處理這些結構中的數據。
逐步教學:列印一維陣列
- 從 0 到陣列長度減 1 開始執行迴圈。
- 在迴圈內部,使用迴圈計數器作為索引。
- 列印該索引處的元素。
逐步教學:搜尋二維陣列
- 使用巢狀迴圈 (Nested Loop)(即迴圈中的迴圈)。
- 外層迴圈遍歷每一列。
- 內層迴圈遍歷該列中的每一欄。
- 檢查 [列][欄] 處的值,看它是否與你要尋找的目標相符。
考試重點總結
- 數據結構是用於組織數據以使其發揮效用的方法。
- 靜態結構(如傳統陣列)具有固定的長度。
- 動態結構(如列表)可以增加或縮小。
- 索引從 0 開始。
- 二維陣列使用兩個索引:\( array[row][column] \)。
- 在 Python 中,列表是儲存這些集合最常見的方式,但為了應對課程大綱,你必須理解陣列的理論。
快速複習區:
問:靜態數據結構的主要優點是什麼?
答:它在記憶體使用上很有效率且訪問速度快,因為其大小和在記憶體中的位置是固定的。
問:如果一個陣列有 10 個元素,最後一個元素的索引是多少?
答:9(因為我們是從 0 開始算的!)。