上一首歌 → Linked List
Ctrl+Z 復原 → Stack
排隊結帳 → Queue
搜尋附近餐廳 → Tree
Google 搜尋 → Hash Table
你每天都在用,只是不知道名字

資料結構
不是考試科目
是你手機裡每個 App
背後的骨架

Instagram 的演算法、YouTube 的推薦、導航 App 的最短路徑——
這些你每天體驗的東西,都是資料結構在運作。
而且,你早就在用資料結構思考了,只是還不知道它的名字。

↓ 往下看

你早就在用了

翻翻看:這些動作背後是哪種資料結構?

每張卡片是你每天都做的事。先猜猜背後的資料結構,再點開看答案。先備知識激活

你翻開了 0 / 8 張 點擊卡片翻開,看看你的直覺對不對!

為什麼差這麼多

Google 要在 100 億筆資料裡
找到你的關鍵字——

沒有資料結構:平均要比對 50 億次。有了正確的資料結構:最多只需要 33 次。
拉動下方滑桿,親眼看這個差距。主動處理原則 Mayer 2009

搜尋速度比較:Linear Search vs Binary Search
情境:資料庫裡有 1,000 筆資料,你要找其中一筆。
1,000
❌ 沒有資料結構(Linear Search)
500 次
✅ 有資料結構(Binary Search / BST)
10 次
差了 50 倍——n 越大,差距越誇張。把滑桿拉到最右邊看看!

兩個工程師的故事

同樣的任務,差了一億次多餘的操作

敘事說服理論告訴我們:故事比說教更能讓人真正理解。看看兩個工程師面對同一個問題時,思路有什麼不同。敘事說服 Green & Brock 2000


AI 時代的關鍵問題

「ChatGPT 都能幫我寫程式了,
我為什麼還要學?

AI 能幫你生成程式碼,但看不懂、改不動、不知道哪裡錯——這些問題 AI 解決不了。下面三個情境,讓你親眼看見「基礎知識的缺口」在哪裡。效用價值 Eccles et al. 1983

🤖 AI 是你的協作夥伴,不是替代品

能有效使用 AI 輔助寫程式的人,都具備一個關鍵能力:「看懂 AI 給的程式碼,並判斷它是否正確」。這需要你懂得:資料結構的選擇邏輯、演算法的時間複雜度、程式語法的意義。沒有這些基礎,你只能「複製貼上然後祈禱」——而不是真正的協作。

AI 生成了一個「管理學生名單」的程式AI 生成
😵 不懂基礎的人看到的
// 這是什麼?不知道
struct Node {
  string name;
  Node* next;  // ← 這行是什麼?
};
void insertFront(Node*& head, string n){
  Node* p = new Node();  // ← new?
  p->name = n;
  p->next = head;  // ← 為什麼這樣?
  head = p;
}
// 名單順序全錯了 😭
// 不知道哪裡出問題
💡 懂 Linked List 的人看到的
// Node = 資料 + 指向下一個的指標
struct Node {
  string name;
  Node* next;  // ← 指標,指向下一節點
};
void insertFront(Node*& head, string n){
  Node* p = new Node(); // 動態建立節點
  p->name = n;
  p->next = head; // 新節點指向舊 head
  head = p;
}
// 程式本身沒錯!
// insertFront 本來就是倒序
// → 應改用 insertBack 或最後 reverse
關鍵差距:不懂 Linked List 的人看到錯誤只能「問 AI 幫我修」——但根本不知道描述什麼問題。懂的人一眼看出:程式碼本身沒錯,是 insertFront 和 insertBack 的行為預期不同。這個判斷需要你懂資料結構,AI 替代不了。
沒有基礎的人怎麼問 AI
😵
學生
我的程式跑出來的名單順序是反的,幫我修一下
🤖
AI
你可以在建立完名單後加一個 reverse() 函式來反轉……(給了可能可行的答案,但學生不知道為什麼,下次一樣的問題還是不會)
有基礎的人怎麼問 AI
💡
學生
我用 insertFront 建立 Linked List,所以每次插入都在開頭,導致順序反了。我想讓名單按插入順序排列,應該改成 insertBack 還是最後做一次 reverse?哪個比較有效率?
🤖
AI
這是個好問題!如果名單不常重新排列,用 insertBack 加一個 tail pointer 是 O(1),比每次 reverse 的 O(n) 更有效率。這裡是修改後的程式碼……(給出精確且有品質的解答)
AI 幫你寫了一個「找出重複學號」的程式,但跑起來超慢AI 生成
😵 不懂複雜度的人
// AI 給的版本,能跑但很慢
for (int i = 0; i < n; i++) {
  for (int j = i+1; j < n; j++) {
    if (s[i] == s[j])
      cout << "重複: " << s[i];
  }
}
// 10,000 個學生跑了 30 秒
// 不知道為什麼這麼慢
// 這是 O(n²) 的寫法
// 但不懂就不知道怎麼改
💡 懂資料結構的人
// 知道 O(n²) 太慢
// 跟 AI 說:「請用 O(n) 的方法」

unordered_set<string> seen;
for (int i = 0; i < n; i++) {
  if (seen.count(s[i]))
    cout << "重複: " << s[i];
  seen.insert(s[i]);
}
// 同樣 10,000 個學生:0.001 秒
// 差了 30,000 倍
// 因為懂「Set 查找是 O(1)」
關鍵差距:AI 預設給你「能跑的答案」,不一定給你「最有效率的答案」。要讓 AI 給出更好的解,你必須懂得在 prompt 裡說「請用 O(n) 複雜度」、「請用 Hash Set」——這些詞彙來自資料結構的知識。不懂的人只能等著程式跑 30 秒。
要設計一個「選課系統」,你要怎麼跟 AI 說?
😵 沒有基礎的 Prompt
「幫我寫一個選課系統,
 可以新增、刪除、查詢課程」

AI 可能給你:
→ 用 Array 儲存所有課程
→ 每次搜尋從頭掃到尾 O(n)
→ 等待名單用 Array 亂插

你不知道這樣不好,
因為你不知道有更好的選擇。
💡 有基礎的 Prompt
「幫我寫一個選課系統:
 - 課程編號唯一,用 Hash Map
   讓查詢是 O(1)
 - 等待名單用 Queue(先到先得)
 - 先修關係用 Tree/Graph 表達」

AI 現在能給你
真正適合這個問題的架構
你也能判斷它給的對不對
因為你知道每個選擇的理由
關鍵差距:AI 是你的實作工具,但你是架構師。要告訴 AI「用什麼」解決問題,需要你先知道「什麼工具適合什麼情境」——這正是資料結構這門課在訓練的思維。沒有這個思維,你給 AI 的 prompt 永遠只能說「幫我做一個系統」,而不是「用這些結構幫我做」。

現在,你有了動機了嗎?

你每天都在用的東西,背後是資料結構。
你想駕馭 AI 而不是被它牽著走,需要資料結構。
選一個你最好奇的地方,開始吧。