堆积,动态规划-建中首页
CK6125 姜俊宇
堆積結構 Heap
Heap 是一種頗常見且好用的資料結構之一 ,可以迅速插入刪除元素,並在O(1)的時間內找到極值 。
Heap 的性質
1. Heap 是一棵完全二元樹(Complete Binary Tree)或是空樹
2. 每個節點必定小(大)於其子節點每個節點必定是以其為根的子樹中最小(大)的一個點 。
Heap 的實現
由於 Heap 是一棵完全二元樹 ,所以可以用一般的陣列(Array)實現 。
令整棵 Heap 的 root 為 heap[1] ,則節點heap[x]的左子節點為 heap[2x] ,右子節點為heap[2x+1]
Heap 的操作(以下皆以 Min-Heap 為例)
最小堆化 Min-Heapify(x) – O(lgn)
當 heap[x]的兩個子樹 heap 特性時 ,將以heap[x]為根的整個子樹 heap 化。
上移元素 Heap-Up(x) – O(lgn)
當 heap[x]可能小於父節點時 ,將heap[x]作更動以保持 heap 特性 。
插入元素 Insert(x) – O(lgn)
將一個元素 v 插入 heap 中並保持 heap 特性 。
刪除元素 Delete(x) – O(lgn)
將位於 heap[x]的元素從 heap 中刪除 ,並保持heap 特性 。
MIN-HEAPIFY (x) HEAP-UP (x)
1 l ← x × 2 1 while x 1 and Heap [x]Heap [PARENT(x)]
2 r ← x × 2 + 1 2 do exchange Heap [x] ↔Heap [PARENT(x)])
3 if l ≤ n and Heap [l].key Heap [x].key 3 x ← Parent(x)
4 then min ← l
5 else min ← x INSERT (v)
6 if r ≤ n and Heap [r].key Heap [min].key 1 n ← n + 1
7 then min ← r 2 Heap [n] ← v
8 if min ≠x 3 HEAP-UP (n)
9 then exchange Heap [x] ↔Heap [min]
10 MIN-HEAPIFY(min) DELETE (x)
1 exchange Heap [x] ↔Heap [n]
FIND-MIN () 2 n ← n – 1
1 return Heap [1] 3 if x 1 and Heap [x] PARENT(x)
4 then HEAP-UP (x)
想一想
5 else MIN-HEAPIFY (x)
ACM 10954 Add All
給定一堆數 ,取出兩個數加起來之後丟回去,重複動作直到只剩一個數,問該數最小多少。
ACM 978 Lemming Battle!!
給定戰場數 、兩軍的兵數以各自的戰鬥力,每一輪各推派戰鬥力最強幾位的去各個戰場戰鬥,若一
方人數不足則戰場留空 。若雙方戰鬥力相同則同歸於盡,否則戰鬥力強者活且戰鬥力會變弱,變弱的
程度相當於對方
原创力文档

文档评论(0)