1.Data_Structure

資料結構是程式設計與演算法的核心,決定資料如何在記憶體中儲存與操作。正確選擇資料結構能顯著提升程式效率與可維護性。


1. 基本資料結構

陣列(Array)

  • 固定長度、連續記憶體配置

  • 優點:快速索引(O(1))

  • 缺點:新增/刪除元素需搬移(O(n))

arr = [1, 2, 3]
print(arr[1])  # 輸出 2

鏈結串列(Linked List)

  • 節點組成,每個節點包含值與下一個節點指標

  • 優點:插入/刪除元素快速(O(1))

  • 缺點:索引需逐步尋訪(O(n))

class Node:
    def __init__(self, value):
        self.value = value
        self.next = None

堆疊(Stack)

  • 後進先出(LIFO)

  • 操作:push(壓入)、pop(彈出)

stack = []
stack.append(1)
stack.pop()

佇列(Queue)

  • 先進先出(FIFO)

from collections import deque
queue = deque()
queue.append(1)
queue.popleft()

2. 樹與圖

二元樹(Binary Tree)

  • 每個節點最多有兩個子節點

  • 常見變種:二元搜尋樹(BST)、堆積樹(Heap)

class TreeNode:
    def __init__(self, val):
        self.val = val
        self.left = None
        self.right = None

圖(Graph)

  • 節點與邊組成,可為有向或無向圖

  • 表示法:鄰接矩陣、鄰接串列

  • 應用:社交網路、路徑搜尋

graph = {
    'A': ['B', 'C'],
    'B': ['A', 'D'],
    'C': ['A'],
    'D': ['B']
}

3. 雜湊表與集合

雜湊表(Hash Table / Dictionary)

  • 以鍵值對儲存資料,快速查找(平均 O(1))

d = {"apple": 3, "banana": 2}
print(d["apple"])

集合(Set)

  • 儲存不重複元素

s = set([1, 2, 2, 3])
print(s)  # {1, 2, 3}

4. 時間與空間複雜度(Big-O)

操作
陣列
鏈結串列
堆疊/佇列
雜湊表
搜尋樹

插入

O(n)

O(1)

O(1)

O(1)

O(log n)

刪除

O(n)

O(1)

O(1)

O(1)

O(log n)

搜尋

O(1)

O(n)

O(n)

O(1)

O(log n)


小結

掌握常見資料結構有助於撰寫高效能程式,並為學習演算法打下良好基礎。建議配合實作練習、LeetCode 題目與圖解資源深入理解各資料結構的適用場景與特性。

Last updated