字典簡介

你好!歡迎來到數據結構基礎中最實用的章節之一。到目前為止,你可能已經使用過陣列 (Arrays)列表 (Lists),這些結構都是透過數字(索引)來尋找資料。但如果你想透過名稱或標籤來查找資料呢?這正是字典 (Dictionaries) 發揮作用的地方!

你可以把字典想像成手機裡超級強大的聯絡人清單。你不需要記住朋友是「第 42 號聯絡人」來找他;你只需要輸入他的名字。字典讓搜尋特定資訊變得既快速又直觀。讓我們深入了解吧!

1. 什麼是字典?

在電腦科學中,字典是一種抽象資料型態 (Abstract Data Type, ADT),它以鍵值對 (Key-Value Pairs) 的形式儲存資料。

字典中的每一項資料都包含兩個部分:
1. 鍵 (Key):這充當了唯一的識別碼(就像實體字典中的單字,或是通訊錄中某人的姓名)。
2. 值 (Value):這是與該鍵相關聯的實際資料(就像單字的定義,或是該人的電話號碼)。

鍵的黃金法則

在任何字典中,鍵 (Keys) 必須是唯一 (unique) 的。你不能擁有兩個相同的鍵,因為電腦將無法判斷該回傳哪一個值!不過,值 (Values) 則不需要唯一——兩個不同的鍵可以對應到同一個值。

快速複習:鍵 vs. 值
- 鍵 (Key):你用來查找資料的標籤(必須唯一)。
- 值 (Value):系統回傳給你的資料(可以是任何內容)。

重點總結

字典是一組鍵值對的集合,你可以透過相關聯的來存取其對應的

2. 字典與陣列的比較

如果這聽起來有點抽象,別擔心!讓我們把它和你已經熟悉的陣列 (Array) 比較一下。

陣列中,「鍵」永遠是整數索引 (integer index)(0, 1, 2...)。是由電腦決定位置。
字典中,「鍵」幾乎可以是任何資料型態,例如字串 (string)。由你(程式設計師)決定標籤的內容。

範例:
陣列: Names[0] = "Alice"
字典: Ages["Alice"] = 17

你知道嗎?
在搜尋特定項目時,字典通常比陣列快得多。在一個龐大的陣列中,你可能需要檢查每一個格子才能找到「Alice」。而在字典中,你只需直接要求查找「Alice」,電腦就能精確地知道該值儲存在哪裡!

3. 現實應用

AQA 課程大綱特別提到資訊檢索 (Information Retrieval) 是字典的核心用途。一個經典的例子是統計文件中單字出現的次數。

步驟拆解:單字頻率統計

想像我們有這樣一個句子:"The green, green grass grows"。我們想要儲存每個單字出現的次數。我們可以將其表示為一個字典:

1. "The":出現 1 次。
2. "green":出現 2 次。
3. "grass":出現 1 次。
4. "grows":出現 1 次。

以程式語言的符號表示如下:
{ 'the': 1, 'green': 2, 'grass': 1, 'grows': 1 }

重點總結

字典非常適合快速檢索資訊,例如查詢定義、識別碼 (ID) 或統計頻率。

4. 以字典表示向量

在課程稍後,你會接觸到向量 (Vectors)。課程大綱指出,當我們將向量視為一個函數 (function) 時,字典是用來表示向量的一種非常有用的方式。

對於像 \( [2.0, 3.14, -1.0] \) 這樣的向量,我們可以將其視為一種映射,其中索引對應到一個值:
\( 0 \mapsto 2.0 \)
\( 1 \mapsto 3.14 \)
\( 2 \mapsto -1.0 \)

在字典中,這會是:{0: 2.0, 1: 3.14, 2: -1.0}。這對於「稀疏向量 (sparse vectors)」特別有效,因為大部分數值為零時,我們只需要儲存那些確實有資料的鍵即可!

5. 常見操作

當你在程式專案中使用字典時,通常會執行以下四項任務:

  • 新增 (Add) 一組新的鍵值對。
  • 刪除 (Delete) 現有的鍵值對。
  • 修改 (Amend/Update) 現有鍵對應的值。
  • 查詢 (Lookup) 鍵所對應的值。

避免常見錯誤:
嘗試存取不存在的鍵!如果你要求字典回傳 "Bob" 的值,但字典裡並沒有 "Bob",你的程式很可能會因為「鍵錯誤 (Key Error)」而崩潰。務必先檢查該鍵是否存在!

記憶小幫手:鑰匙圈
想像一個實體的鑰匙圈。每一把鑰匙 (Key) 都有獨特的形狀。當你使用那把鑰匙時,它能打開一扇特定的門 (Value)。你可以把很多鑰匙掛在圈上,但每一把都是獨一無二的!

快速複習總結

它是什麼? 一組鍵值對的集合。
有順序嗎? 從概念上講,字典是無序的。我們關注的是關聯性 (association),而不是序列。
鍵的規則: 鍵必須唯一;值不需要唯一。
主要用途: 快速資訊檢索及表示複雜的映射關係(如向量)。

最後的鼓勵

如果你習慣了陣列那種嚴格的「0, 1, 2」索引,字典一開始可能讓你覺得有點陌生,但一旦你開始使用它,你會發現它讓你的程式碼更易讀、執行效率更高。在接下來的程式練習中多嘗試使用它吧!