Please enable JavaScript.
Coggle requires JavaScript to display documents.
資料結構 - Coggle Diagram
資料結構
1 串列(List):線性資料與動態儲存
定義與特性
順序資料:每個元素有位置
保留順序,可用 index 取第 i 項
可變序列:新增、刪除、更新
insert/delete 會造成後方元素 shift
List ADT:介面與實作分離
ADT 管 what;array/linked list 管 how
OOP:用 class 封裝操作
封裝資料,只開放定義好的方法
底層表示
參照陣列:存物件 reference
list 存 PyObject reference,不直接存物件
動態陣列:容量不足會 resize
配置更大陣列、複製、舊陣列 GC
append 平均 O(1):攤銷分析
resize 單次 O(n),平均攤銷 O(1)
Linked List:Node + pointer
Node = data + next;不需連續記憶體
操作與複雜度
index / slicing:快速定位
array O(1);linked list 要從 head 走
insert / delete:中間操作 O(n)
array 要 shift;已知 linked position 可 O(1)
traversal:逐項走訪 O(n)
current = current.next 直到 None
reverse / sort:改變資料順序
排序涉及比較與搬移,不只是語法
演算法與 Lab
Caesar cipher:ord/chr 位移
字元轉數字,加 shift 後 mod 26
High Scores:維持排行順序
新高分插入,低分往右移
Linked List:append / insert / remove
append 找尾端;remove first 更新 head
Insertion Sort:逐步插入正確位置
從 sorted portion 往左比較與插入
應用與心得
適合:成績、紀錄、文字序列
資料有順序或歷史時優先考慮
索引多:list 較合適
random access 是 array-based list 強項
插刪多:linked list / deque
deque 兩端操作可 worst-case O(1)
心得:語法背後有記憶體成本
resize、shift、pointer 都是成本
關聯與比較:list 是線性基礎,array 快索引、linked list 強在已知位置插刪,deque 適合兩端操作
關聯與比較:list 是線性基礎;array 快索引,linked list 強在已知位置插刪,deque 適合兩端操作
關聯與比較:list 是線性基礎;array 快索引,linked list 強在已知位置插刪,deque 適合兩端操作
生活案例:播放清單、瀏覽紀錄、成績排行、待辦清單都需要保留順序
Lab 心得:High Scores 與 Linked List 讓 shift、resize、pointer 成本變成可觀察的程式行為
2 表格式資料結構(Table-like Structures):雜湊查找與表格
Set 與 Dict
Set:唯一、無序、去重
membership testing、去重、聯集交集
frozenset:不可變集合
不可 add/remove,適合穩定集合值
Dict:key-value mapping
add/update/remove/search/iterate
key 通常必須可雜湊
同 key 覆蓋舊值,hash 要穩定
Hash Table 機制
hash function:key 轉 index
deterministic,同 key 要回同 bucket
平均 O(1):查找、插入、刪除
靠 bucket 定位,避免掃描全部資料
collision:不同 key 同位置
05 p.15:解法一 chaining
bucket 存 entries 串列
單一 bucket 最壞查找 O(n)
05 p.15:解法二 open addressing
碰撞後找下一個 open slot
linear probing:index+1、index+2
load factor 影響 resize
負載太高 collision 變多,需擴充表格
Collision 處理
chaining:同格串接
bucket 內用 linked list/list 串接
open addressing:探測其他格
不串列,往表內其他空格探測
碰撞過多會退化
平均 O(1) 會接近線性查找
設計重點:分散與穩定
Table 表格表示
list of lists:密集矩陣
幾乎每格有值時,二維 list 直觀
dict sparse table:只存非空資料
用 (row,col) tuple 當 key
nested dict:多層 key 組織
適合 JSON、profile、inventory
Table class:
getitem
模擬容器
封裝 row/column 存取,像容器一樣操作
Lab、工具與應用
hashlib:MD5 / SHA256 校驗
hashing one-way;encryption two-way
Counter:文字頻率統計
dict subclass,key 是元素、value 是次數
defaultdict / OrderedDict / ChainMap
default、順序、合併 mapping 視角
應用:email 去重、快取、聯絡人查詢
set 去重;dict 查詢;hash 驗檔
關聯與比較:list 用位置找資料,dict 用 key 直接定位;set 保留 membership,table 可由 list 或 dict 表示
關聯與比較:list 用位置找資料,dict 用 key 直接定位;set 保留 membership,table 可由 list 或 dict 表示
生活案例:email 去重、帳號查詢、快取 cache、庫存表與座位表都依賴 key-value 查找
Lab 心得:Counter、defaultdict、hashlib 把雜湊從查找延伸到統計、分組與檔案校驗
3 樹狀結構(Tree):階層資料與搜尋
Tree 基本名詞
root:整棵樹起點
root 沒有 parent,是深度計算起點
parent / child / sibling
同一 parent 的 children 互為 sibling
internal node / leaf
internal 有 child;leaf 沒有 child
ancestor / descendant / path
path 是節點序列,用方向判斷祖先後代
BST 心得:插入順序會影響高度,平衡與否直接決定搜尋成本
left-root-right 得到遞增 key
深度、高度與 ADT
depth:離 root 的距離
root depth = 0,往下一層加 1
height:往下最大層數
leaf height = 0;樹高影響搜尋
Position:抽象節點位置
包裝 node,避免直接碰實作細節
Tree ADT:隱藏 node 實作
root、parent、children、is_leaf 等介面
Traversal 走訪
DFS:往深處探索
沿分支走到底,再回到下一分支
BFS:逐層拜訪
用 queue,先拜訪同一深度
preorder / postorder
preorder 先 root;postorder 後 root
inorder:BST 可輸出排序
Traversal 關聯:preorder/postorder/inorder 可把階層 tree 轉成線性序列分析
插入順序會影響 BST 高度與成本
Binary Tree 與 BST
binary tree:最多兩個 child
left/right 有順序,可表決策或運算式
array 表示:2i+1、2i+2
root=0;parent=floor((i-1)/2)
BST:左小右大
小於 root 往左,大於 root 往右
search / insert / delete 成本 O(h)
平衡 O(log n),退化鏈狀 O(n)
工具、應用與心得
bigtree:list / dict / dataframe 建樹
Python 無內建通用 tree,可用 bigtree
可輸出 dict、dot、image
print_tree、tree_to_dict、tree_to_dataframe
應用:檔案系統、分類、索引
適合階層關係,不是單純線性資料
心得:平衡度決定搜尋效率
關聯與比較:list 是線性序列,tree 是階層結構;BST 用左小右大把查找變成路徑選擇
生活案例:資料夾、網站 DOM、分類目錄、決策流程都適合用 tree 表示階層
Lab 心得:bigtree 與 traversal 讓 root、parent、path 不只是圖形,而是可程式操作的關係
4 進階樹狀結構(Advanced Tree Topics):AVL、Heap 與 MST
MST 最小生成樹
來源:加權無向連通圖
connected、undirected、weighted graph
目標:連全部頂點且總權重最小
保留 V-1 條邊,讓所有 vertex 連通
不能形成 cycle
cycle 代表有多餘邊,不再是 tree
應用:網路、道路、管線、分群
network design、clustering、approximation
Heap 心得:complete tree 讓陣列索引可定位 parent/child,priority queue 實作才有效率
key 最小權重;parent 來源;mstSet 防 cycle
Prim 演算法
從任一 vertex 開始
從一個起點逐步擴張 MST
每次選最小 crossing edge
一端在 MST、一端尚未加入才可選
key / parent / mstSet 紀錄狀態
適合逐步擴張生成樹
搭配 priority queue 可到 O(E log V)
Kruskal 與 Union-Find
先排序所有 edges
依 weight 由小到大,是 global greedy
小邊優先且避免 cycle
同集合會成 cycle,該邊捨棄
find / union 判斷集合
find 找代表;union 合併集合
path compression / union by rank
壓平路徑、按 rank 合併以降成本
AVL Tree
balance factor 判斷失衡
比較左右高度,null height = -1
平衡條件:|HL-HR| <= 1
允許差 1,避免過度頻繁旋轉
LL / RR 單旋轉
LL 右旋;RR 左旋
LR / RL 雙旋轉
LR 左再右;RL 右再左
Heap 與 Priority Queue
complete binary tree
最後一層由左到右填,利於陣列存
min-heap / max-heap
min 根最小;max 根最大;siblings 不必排序
heapify / heappush / heappop
push 上浮;pop 移根後重建 heap property
應用:排程、事件、heap sort、圖演算法
priority queue 讓最高優先或最低成本先處理
關聯與比較:MST 是 graph 轉成最低成本 tree;AVL 保持 BST 平衡;heap 用樹形維持 priority
生活案例:網路佈線、道路規劃、任務排程、事件模擬都需要成本或優先順序決策
Lab 心得:Prim、Kruskal、heapq 讓 greedy 選邊與 priority queue 的效率差異具體化