歡迎來到資料結構的世界!

在本章中,我們將探討電腦是如何組織資訊的。試想一下,如果你要在凌亂的衣櫃裡找一雙特定的襪子,這簡直是永無止境的折磨!但如果你把襪子放進抽屜,把襯衫掛好,把鞋子擺在鞋架上,找東西就變得輕而易舉了。資料結構 (Data structures) 正是電腦世界裡的「抽屜」與「架子」。它們能幫助我們有效地儲存與管理資料,讓程式運行得既快速又有條理。如果初次接觸覺得有點抽象也別擔心,我們會運用大量生活中的例子,讓一切變得一目瞭然!

1. 什麼是資料結構?

資料結構是一種用於組織、處理、檢索與儲存資料的特殊格式。你可以把它想像成將相關的資料項目歸類在一起,以便更有效地使用它們。

現實類比: 圖書館就是一個巨大的資料結構。書本絕不會被隨意扔在地上,而是按照類別、作者或杜威十進位圖書分類法進行整理。這種「結構」讓我們能在幾分鐘內,從成千上萬本書中找到想要的那一本。

重點回顧:為什麼我們需要它?

  • 處理大量數據。
  • 加快搜尋資訊的速度。
  • 運用經過驗證的方法,解決複雜的問題。

2. 陣列:結構的基石

陣列 (Array) 是最基本且最常見的資料結構之一。它是一組相同資料類型的元素,按順序儲存而成。

一維陣列 (Single-Dimensional Arrays)

你可以把它想像成一個簡單的清單。在一維陣列中,你可以用來表示數學上的向量 (vector)。清單中的每一項都有一個索引(通常從 0 或 1 開始),讓你能輕鬆找到它。

多維陣列 (Multi-Dimensional Arrays)

二維陣列就像一個網格或表格(包含行與列),在數學上常用來表示矩陣 (matrix)。廣義來說,n 維陣列就是一組由 \(n\) 個整數組成的「元組 (tuple)」來進行索引的元素集合。

現實類比:
- 一維陣列: 學校走廊上的一排儲物櫃。
- 二維陣列: 電影院的座位表(F 行,12 號座)。

3. 欄位、記錄與檔案

有時候,我們需要將不同類型的資料組合在一起。例如,如果你正在建立一個學生資料庫,你可能需要姓名(字串)、年齡(整數)和成績(浮點數)。

  • 欄位 (Field): 單一資訊(例如:「學生姓名」)。
  • 記錄 (Record): 相關欄位的集合(例如:某位特定學生的所有資料)。
  • 檔案 (File): 儲存在電腦中的記錄集合。

重要提示: 你需要學會如何讀取與寫入文字檔 (text files)(人類可讀)以及二進位檔 (binary files)(電腦可讀代碼)。

4. 抽象資料類型 (ADTs)

這聽起來很深奧,但其實是個非常有用的概念!抽象資料類型 (Abstract Data Type, ADT) 是一種從使用者角度定義其行為的資料結構。它告訴我們資料「做什麼」,而不是在底層「如何編碼」。

「汽車」類比: 當你開車時,你只需要操作方向盤和踏板(介面)。你不需要確切了解引擎如何燃燒燃料或齒輪如何轉動(實作),就能讓車子移動。ADT 的運作原理正是如此!

你需要掌握的關鍵 ADT:

  • 佇列 (Queue): 就像店裡的排隊。最先進入的人最先獲得服務(FIFO - 先進先出)。
  • 堆疊 (Stack): 就像堆疊餐盤。最後放上去的盤子,是第一個拿走的(LIFO - 後進先出)。
  • 圖 (Graph): 由「節點」與連接它們的「邊」組成的集合(就像倫敦地鐵圖)。
  • 樹 (Tree): 資料的階層結構(就像家譜或你電腦裡的資料夾)。
  • 雜湊表 (Hash Table): 一種儲存資料的方式,讓你透過「鍵 (key)」幾乎能瞬間找到資料。
  • 字典 (Dictionary): 鍵值對的集合(就像真正的字典:單字 -> 定義)。
  • 向量 (Vector): 一種表示同時具有大小與方向的數學量的方式。

核心觀念: ADT 讓程式設計師能專注於程式的邏輯,而不必陷入記憶體管理的「繁瑣細節」中。

5. 靜態與動態資料結構

這是考試中的熱門題目!資料結構可分為靜態或動態。

靜態資料結構 (Static Data Structures)

這類結構在程式啟動時就有固定大小
- 優點: 記憶體一次性分配,速度快且效率高。
- 缺點: 如果沒用滿會浪費記憶體;如果數據太多則會空間不足。

動態資料結構 (Dynamic Data Structures)

這些結構在程式運行時可以擴展或縮減
- 優點: 僅使用實際需要的記憶體空間。
- 缺點: 編寫程式較複雜,且因為電腦需要不斷搜尋新的記憶體空間,速度可能稍慢。

快速回顧框:
靜態 (Static) = 固定大小(像木盒)。
動態 (Dynamic) = 靈活大小(像氣球)。

6. 建立與維護資料

課程大綱要求你理解如何建立並維護特定的結構。我們會在後續章節深入探討,但這裡先提供一個「速查表」:

佇列 (Queue)(線性、循環、優先級)
  • 新增 (Add): 將項目放到末端 (Enqueue)。
  • 移除 (Remove): 從前端取出項目 (Dequeue)。
  • 滿/空檢查: 新增前務必檢查空間是否足夠,移除前檢查是否有資料!
堆疊 (Stack)
  • 推入 (Push): 將項目加到頂端。
  • 彈出 (Pop): 從頂端移除項目。
  • 檢視 (Peek): 查看頂端項目而不移除它。
雜湊表 (Hash Table)
  • 使用雜湊演算法 (hashing algorithm) 將「鍵」轉為記憶體位址。
  • 碰撞 (Collision): 如果兩個不同的鍵想要同一個位址怎麼辦?你需要處理方法(例如「再雜湊」)。

堆疊與佇列的記憶法:
- Stack = Stop(最後進去的是在頂部/停止的地方)。LIFO
- Queue = Quick(最先進去的人很快就出去了)。FIFO

最終重點整理

1. 資料結構只是儲存資料的組織方式。
2. 陣列是最基本的結構,且可以是多維的。
3. 抽象資料類型 (ADT) 專注於邏輯行為,而非物理代碼。
4. 靜態結構大小固定;動態結構則靈活可變。
5. 不同的結構(如堆疊與佇列)用於不同的特定任務。

如果覺得要背的東西很多,不用擔心!當你開始在自己的程式中使用它們時,這些概念就會變得像直覺一樣自然。繼續練習吧!