📚 進階數據結構:字典 (Dictionaries) (9645) 📚

歡迎來到我們探討常見數據結構的最後一章!你已經掌握了線性結構,例如陣列 (Arrays)、列表 (Lists)、隊列 (Queues) 和堆疊 (Stacks)。當資料順序很重要,或是你需要根據位置(索引)存取資料時,這些結構非常有用。

但如果你想儲存資訊,並透過「名稱」或「標籤」而非位置來查詢該怎麼辦?這就是字典 (Dictionary) 發揮強大威力的地方。看完這份筆記後,你將理解這個在現代程式設計中隨處可見,且極具效率的數據結構。


1. 理解字典的概念

字典(在其他程式設計語境中,有時也稱為關聯陣列 (associative array)映射 (map)雜湊表 (hash map))是一種基礎的數據結構,用於儲存需要透過唯一識別碼進行快速檢索的資料。

根據課程大綱,字典的核心概念為:

一個由鍵值對 (key-value pairs) 組成的集合,其中數值 (value) 是透過其關聯的鍵 (key) 來存取的。

電話簿的比喻

想像一下你手機裡的聯絡人清單:

  • 如果你想打電話給「Sarah」,你不需要捲動瀏覽每一組號碼來尋找她的資料。
  • 你只需直接搜尋「Sarah」。

在這個比喻中:

  • 姓名 "Sarah" 就是鍵 (Key)
  • Sarah 的電話號碼(以及地址、電郵等)就是數值 (Value)

你使用這個唯一且具描述性的鍵(名稱)來立即找到對應的資料(號碼)。

字典中的關鍵術語

字典由多對資料組成,每一對都包含兩個元素:

➤ 鍵 (Key)(識別碼)

鍵 (Key) 是用於搜尋資料的唯一標籤或索引。可以把它想像成地址。

  • 鍵必須是唯一的:同一個字典中不能有兩個完全相同的鍵(否則系統會無法判斷該檢索哪一個數值)。
  • 鍵應為不可變 (immutable):一旦建立,通常不能更改(例如數字、字串或 ID)。
➤ 數值 (Value)(資料內容)

數值 (Value) 是你想儲存及檢索的實際資料。可以把它想像成儲存在該地址裡的資訊。

  • 數值不需要唯一:多個鍵可以指向同一個數值(例如:三個不同的學生可能都獲得了 'A' 的成績)。
  • 數值可以是可變的 (mutable):它們在儲存後可以被更改或更新。

你知道嗎? 字典之所以能從鍵中如此快速地檢索數值,其底層機制通常涉及一種稱為雜湊 (hashing) 的數學技術(如果你之後研讀雜湊表時會學到更多細節!)。

快速複習:字典 vs. 列表/陣列

列表/陣列:透過位置(索引 0, 1, 2, ...)進行存取。順序很重要。
字典:透過(標籤、ID、名稱)進行存取。順序通常並不重要。


2. 字典的簡單應用 (3.10.5 內容)

每當你需要將一項資訊直接對應到另一項時,就會用到字典。以下是一些簡單且常見的應用:

1. 儲存設定檔 (Configuration Settings)

當軟體需要記住設定(如遊戲的音量大小,或網站的預設語言)時,字典是理想的選擇。

範例:一個遊戲配置字典看起來可能是這樣:

  • 鍵:'Volume',數值:85
  • 鍵:'Resolution',數值:'1920x1080'
  • 鍵:'Language',數值:'English'

2. 將識別碼對應到記錄 (Mapping Identifiers to Records)

如果你有大型資料集,你需要一種快速方法來尋找特定記錄,而不是搜尋整個列表。

範例:儲存學生資料:

  • 鍵:'Student_ID_901',數值:{姓名: 'Liam', 成績: 'A'}
  • 鍵:'Student_ID_902',數值:{姓名: 'Zoe', 成績: 'B'}

3. 計算頻率 (Frequency Counting)

字典非常適合計算某個事物出現的頻率(例如計算文章中的單字出現次數)。該項目本身成為鍵,其計數則成為數值。

  • 鍵:'Apple',數值:5
  • 鍵:'Banana',數值:12

4. 實作查表 (Look-Up Tables)

如果你需要將一個代碼或術語即時轉換為另一個,字典就是完美的查表工具。

範例:將國家代碼轉換為全稱:

  • 鍵:'UK',數值:'United Kingdom'
  • 鍵:'FR',數值:'France'
重點:靈活性

字典提供了極高的靈活性,因為索引(鍵)是由資料本身決定的,而不是由它的數值位置決定的。這使得無論字典的大小如何,查詢操作都極為快速。


3. 使用程式語言函式庫 (3.10.5 內容)

在大多數現代程式語言(如 Python、C# 或 Java)中,字典數據結構都是作為內建類型或透過標準函式庫提供的。你應具備使用實作此結構的程式語言函式庫之相關經驗。

即使不同語言的語法有所不同,也不用擔心;其基本操作原理都是一樣的:

字典的基本操作

1. 插入 (Inserting) 鍵值對

此操作將一個新的唯一鍵及其對應的數值加入到字典中。

比喻:在你的電話簿中加入一個新聯絡人。

2. 檢索 (Retrieving/Looking Up) 數值

這是最常見且最重要的操作。你提供鍵,字典即回傳對應的數值。

比喻:搜尋「Sarah」以取得她的號碼。

3. 更新 (Updating) 數值

如果鍵已經存在,你可以指派一個新數值給它。鍵保持不變,但它所指向的資訊會被更改。

比喻:將 Sarah 的電話號碼改為新號碼。

4. 刪除 (Deleting) 鍵值對

這會將鍵及其對應的數值從結構中完全移除。

比喻:從電話簿中刪除一個聯絡人。

⚠ 需避免的常見陷阱

一個常見的錯誤是嘗試使用字典中不存在的鍵來檢索數值。這通常會導致執行時期錯誤(例如 Python 中的 KeyError)。在嘗試直接存取數值之前,你必須確保該鍵確實存在。

記憶口訣:KVP

每當想到字典,請記住 KVPKey-Value Pair (鍵值對)。這是整個結構的核心組成部分。


字典總結

字典是進階數據結構中的強大工具,因為它們以具描述性的唯一鍵取代了數值位置索引,從而提供了極快的查詢速度。對於那些以名稱、ID 或標籤來識別項目的現實世界資料建模而言,它們是不可或缺的。

需要記住的關鍵概念:

  • 字典以鍵值對 (key-value pairs) 儲存資料。
  • 鍵 (Key) 用於存取,且必須是唯一的
  • 應用包括設定檔、資料映射及查表。
  • 你透過標準函式庫功能來進行插入檢索更新刪除資料的操作。

請在你選擇的程式語言中持續練習這些操作,以鞏固你的理解。祝你學習順利!