資料結構 Data Structure - paulip114/blog GitHub Wiki
我們可以用以下方式分類:
- 線性資料結構(Linear Data Structures)
- 非線性資料結構(Non-linear Data Structures)
- 抽象資料型態(Abstract Data Types, ADT)
- 雜湊資料結構(Hashing)
資料結構 | 說明 |
---|---|
Array(陣列) | 固定長度、可快速用索引存取,插入/刪除較慢 |
Linked List(連結串列) | 每個節點連到下一個,插入/刪除快,但查找慢 |
- Singly Linked List | 單向連結串列(只能往後) |
- Doubly Linked List | 雙向連結串列(可前後) |
Stack(堆疊) | LIFO(後進先出),如:網頁瀏覽歷史、函式呼叫堆疊 |
Queue(佇列) | FIFO(先進先出),如:印表機佇列、任務排程 |
- Circular Queue | 首尾相連的 Queue,空間利用率更高 |
- Priority Queue | 根據優先權排序的佇列(底層可用 Heap 實作) |
資料結構 | 說明 |
---|---|
Tree(樹) | 層級關係的資料,常用於表示結構(如 DOM、檔案系統) |
- Binary Tree(每個節點最多兩個子節點) | |
- Binary Search Tree(BST) | |
- AVL Tree / Red-Black Tree(平衡樹,查找效率高) | |
- N-ary Tree(每個節點可有 N 個子節點) | |
- Segment Tree / Fenwick Tree(區間查詢) | |
Heap(堆) | 一種特殊的 Tree,常用於 Priority Queue 和排序(HeapSort) |
- Min Heap(父節點 ≤ 子節點) | |
- Max Heap(父節點 ≥ 子節點) | |
Trie(前綴樹) | 優化字串搜尋,例如:自動補字、拼字檢查器 |
Graph(圖) | 節點 + 邊,適合表示網路、地圖、社交關係等結構 |
- Directed / Undirected Graph(有向 / 無向) | |
- Weighted Graph(邊有權重,例如距離) |
這些是「概念模型」,可用多種資料結構實作:
ADT | 常見實作方式 |
---|---|
List | Array、Linked List |
Stack | Array、Linked List |
Queue | Array、Linked List、Circular Queue |
Deque(雙端佇列) | 可從兩端插入/刪除 |
Set(集合) | Hash Table、BST |
Map(字典) | Hash Table、TreeMap |
資料結構 | 說明 |
---|---|
Hash Table(Hash Map) | 利用 key → value 的快速查找,如:字典、快取系統、資料庫索引 |
- Collision Handling(碰撞處理):Open Addressing、Separate Chaining 等方式 | |
Bloom Filter | 空間效率高但有誤差的查找結構,用於快取預查詢、垃圾過濾等 |
資料結構 | 用途 |
---|---|
Disjoint Set(Union-Find) | 常用於圖論中的聯通性問題(如:Kruskal 最小生成樹) |
LRU Cache | 結合 Hash Map + Doubly Linked List 實作快取淘汰策略 |
Suffix Tree / Array | 用於字串比對、重複字串搜尋等高效處理 |
Interval Tree | 區間交集查詢,適用日曆、排程衝突檢查等 |
- 操作需求: 插入多?查找多?排序需求?
- 資料大小: 記憶體有限嗎?
- 資料關係: 線性?階層?網狀?
- 根據使用者 ID 查找使用者資料
- 根據商品代碼查價格
-
Hash Map / Object / Dictionary
- 快速查找:
O(1)
平均時間 - TypeScript 可用:
Record<string, T>
、Map<K, V>
- 快速查找:
- 排行榜、分數表
- 保持一組數據有序(並不是一次全部排序)
- Binary Search Tree(BST)
- AVL Tree / Red-Black Tree(自動保持平衡)
JS/TS 沒有內建 Tree,可以用外部函式庫或自己實作
Java 的TreeSet
、C++ 的std::set
就是基於平衡 BST
- 任務排程
- 網路請求佇列
- 打印機列隊
- Queue(佇列)
在 TypeScript 中可以用 Array 模擬:
const queue: number[] = [];
queue.push(1); // enqueue
const item = queue.shift(); // dequeue
- 函式呼叫堆疊
- 括號匹配(像是
()[]{}
檢查) - Undo 功能
- Stack(堆疊)
在 TS 中可以用 Array:
const stack: number[] = [];
stack.push(1); // 入堆疊
const item = stack.pop(); // 出堆疊
- 檔案總管(資料夾 → 子資料夾)
- 類別分類(主分類 → 子分類)
- 選單系統(Menu / Submenu)
- Tree(Binary Tree / N-ary Tree)
- 社交網路(人與人的關係)
- 地圖導航(城市、路徑)
- 網頁跳轉圖(Page → Link)
-
Graph(圖)
- 可使用鄰接表(Adjacency List)或鄰接矩陣(Adjacency Matrix)實作
- 頂部 N 個高分
- 優先級處理(像任務優先順序)
- Heap(Min Heap / Max Heap)
JS/TS 沒有內建 heap,可以用外部函式庫或自己實作。
- 自動補字(autocomplete)
- 字典系統
- 拼字檢查
- Trie(前綴樹)
比用陣列搜尋每一筆快非常多,尤其對大量字串處理。
- 不固定長度的資料流
- 中間插入資料
- Linked List(連結串列)
如果要支援雙向移動:
- 使用 Doubly Linked List
- 社群聯通性
- 團體判斷
- 最小生成樹(MST)
- Disjoint Set / Union-Find
- 找出某段時間內的總和 / 最大值
- 區間更新
- Segment Tree
- Fenwick Tree(Binary Indexed Tree)
需求 | 建議資料結構 |
---|---|
根據鍵快速查找 | Hash Map / Dictionary |
排序且動態插入 | BST / AVL Tree / Red-Black Tree |
先進先出佇列 | Queue |
後進先出堆疊 | Stack |
儲存階層資料 | Tree (Binary / N-ary) |
網路圖結構 | Graph |
快速找最大/最小值 | Heap |
字串搜尋 / 自動補字 | Trie |
快速插入 / 刪除 | Linked List |
判斷是否同一群組 | Union-Find |
快速區間查詢 | Segment Tree / Fenwick Tree |