Buttom Up
Top Down
Heap Tree
的Big O
(Minimum Heap)
(Maximum Heap)
(Max/Min Heap)
的建立有兩種形式(Buttom Up)
(Top Down)
Buttom Up - Min Heap(Step 1)
¶15, 8, 20, 18, 17, 25, 19, 5
要如何使用Buttom Up
建構Min Heap
?Step 1:
先依數組順序產生Binary Complete Tree
Buttom Up - Min Heap(Step 2)
¶Step 2:
由下而上, 從有子節點的父節點開始逐一交換節點18
具有子節點, 且5
小於18
故交換8
具備子節點, 且子節點中5
小於8
故交換20
具備子節點, 且子節點中19
小於20
故交換15
具備子節點, 且子節點中5
小於15
故交換Root
後如下一頁投影片右下圖的Tree
所示Buttom Up - Min Heap(Step 2)
¶Buttom Up - Min Heap(Step 3)
¶Root
節點15
是跟左子樹·5
交換, 故檢查左子樹是否符合Min Heap
規則15
與子節點8
跟17
中, 8
小於15
故交換15
小於子節點18
故維持不變, 完成Buttom Up - Min Heap
, 如右下圖所示Top Down - Min Heap
¶15, 8, 20, 18, 17, 25, 19, 5
要如何使用Top Down
建構Min Heap
?Top Down
的建構方式Min Heap
, 若不符合則交換
Top Down - Min Heap
¶15, 8, 20, 18, 17, 25, 19, 5
Top Down - Min Heap
¶15, 8, 20, 18, 17, 25, 19, 5
Top Down - Min Heap
¶15, 8, 20, 18, 17, 25, 19, 5
15, 8, 20, 18, 17, 25, 19, 5
使用Buttom Up
與Top Down
建立Map Heap
Buttom Up
與Top Down
使用同一組數所建構的Heap Tree
一定會一樣嗎?Heap Tree
取值¶Min Heap
取根節點Binary Complete Tree
中的最後一個節點移至根節點Max Heap
取根節點Binary Complete Tree
中的最後一個節點移至根節點Min Heap
取根節點¶Min Heap
取根節點¶Min Heap
取根節點¶15, 8, 20, 18, 17, 25, 19, 5
使用Buttom Up
與Top Down
建立Map Heap
Map Heap
取根節點Binary Complete Tree
中, 再一步一步逐一調整Tree
Min Heap
新增節點3
python
內建函數 - Min Heap
python
內建函數 - Min Heap
¶import heapq
heapq.heapify(data_Set) #Create MinHeapTree
heapq.heappush(data_Set, data) #Insert data
heapq.heappop(data_Set) #Pop Root
## 範例 - Create Min Heap
import heapq
data = [15, 8, 20, 18, 17, 25, 19, 5]
print('Original Data:', data)
heapq.heapify(data)
print('Min Heap Tree:', data)
Original Data: [15, 8, 20, 18, 17, 25, 19, 5] Min Heap Tree: [5, 8, 19, 15, 17, 25, 20, 18]
## 範例 - Insert data to Min Heap
import heapq
data = [15, 8, 20, 18, 17, 25, 19, 5]
print('Original Data:', data)
heapq.heapify(data)
heapq.heappush(data, 3)
print('Min Heap Tree:', data)
Original Data: [15, 8, 20, 18, 17, 25, 19, 5] Min Heap Tree: [3, 5, 19, 8, 17, 25, 20, 18, 15]
## 範例 - Insert data to Min Heap
import heapq
data = [15, 8, 20, 18, 17, 25, 19, 5]
print('Original Data:', data)
heapq.heapify(data)
print('Min Heap Tree:', data)
Root = heapq.heappop(data)
print('Root:', Root)
print('Min Heap Tree:', data)
Original Data: [15, 8, 20, 18, 17, 25, 19, 5] Min Heap Tree: [5, 8, 19, 15, 17, 25, 20, 18] Root: 5 Min Heap Tree: [8, 15, 19, 18, 17, 25, 20]
heapq
常用函數¶heapq.nlargest(n, data_Set) #get n largest on data_Set HeapTree
heapq.nsmallest(n, data_Set) #get n smallest on data_Set HeapTree
## 範例
import heapq
data = [15, 8, 20, 18, 17, 25, 19, 5]
print('Original Data:', data)
largest_number = heapq.nlargest(4, data)
smallest_number = heapq.nsmallest(4, data)
print('Heap Tree中前4個最大的數', largest_number)
print('Heap Tree中前4個最小的數', smallest_number)
Original Data: [15, 8, 20, 18, 17, 25, 19, 5] Heap Tree中前4個最大的數 [25, 20, 19, 18] Heap Tree中前4個最小的數 [5, 8, 15, 17]
heapq
函數heapq
預設建構Min Heap
, 試想可否透過heapq
建構Max Heap
?15, 8, 20, 18, 17, 25, 19, 5
建構Max Heap
Heap Tree
的Big O
¶Heap Tree
:O(log n)
Max Heap
或Min Heap
最大或最小值:O(1)
Heap Tree
:O(log n)