Heap/Flood Fill/Basic Graph
2021/03/20
Lecture By lawfung
目錄
• 合併Heap
• Heap黑魔法
• 建立Heap的時間複雜度
• 左偏樹
• 思考題
• Number of binary tree
Heap
Heap 小知識
世界上的Heap有很多種
• 影片中介紹的Binary heap
• Binomial heap
• Pairing heap
• Thin heap
• Fibonacci heap
• ……
Heap 小知識
• 為什麼會有這麼多種Heap?
• 有的常數比較小
• 有的可以O(1)插入
• 有的可以O(1)刪除
• 有的可以O(logN)合併??
• 有的可以O(1)合併??!!
• 有興趣請自行上網查詢資料
Heap 合併
Heap 合併
• Heap合併是什麼?
• 簡單來說就是把兩個Heap變成一個Heap
模擬情況
• 現在有N個Heap,有三種操作
• Push : 把一個元素放進其中一個Heap
• Pop : 從一個Heap中取出最小的元素
• Merge : 合併兩個Heap
• 假設總操作數最多Q次,其中Push最多N次
Heap 合併
• 先不管複雜度,來想個最天真的作法吧~
• Push和Pop就照一般的做法做
• 合併呢?
• 開一個新的Heap,把原先兩個Heap的元素一個一個的push進去
• 複雜度O(Q*NlogN)
Heap 合併
• 那我們換一種方式
• 把其中一個Heap的元素一個一個的push進另外一個Heap
• 複雜度?
• O(Q*NlogN)
Heap 合併
• 那…如果我們把比較小的Heap慢慢加到另外一個Heap中呢?
• 複雜度?
• O(Q*NlogN)…?
• O(Nlog^2(N)+QlogN) ??!!
• 啟發式合併!
• 考慮對於每一個元素,它每次被併入一個新的集合,它所處集合的大 小至少是原來的兩倍。所以對每個元素至多進行logN次合併操作,總 複雜度N*logN*logN
示意圖
黑色 : 需要拿出再放入其他Heap
紅色 : 當今在的Heap被使用為合併後的Heap
魔法
• 幾個在C++中關於Heap的魔法
• STL
• std::priority_queue
• 黑魔法
• __gnu_pbds::priority_queue
std::priority_queue
• #include <queue>
• std::priority_queue<int> pque;
• priority_queue<int, vector<int>, greater<int> > lque
__gnu_pbds::priority_queue
• #include <ext/pb_ds/priority_queue.hpp>
• __gnu_pbds::priority_queue<int> pque;
• priority_queue<int, greater<int> > lque
• h1.join(h2);
Building Heap
• 如果一開始就已經有所有元素了,要建造出一個Heap
• Insertion of Heap: O(logN)
• 所以Build a heap of N element: O(NlogN)
• 其實這個bound不夠緊,可以壓到O(N)
• https://www.geeksforgeeks.org/time-complexity-of-building-a-heap/
作法
• 從底層往上,將小的子Heap建好後,再將大Heap也完成。
• 接下來是要證明複雜度是O(N)
•
• 然後使用公式 at x=1
2
示意圖
Height Count
3 1
2 2
1 3
0 8
Leftist Tree
為什麼要左偏樹
• 可合併堆
• 雖然其實黑魔法也可以
• 合併多快
• O(log(N)+log(M))
定義
• 外節點 :
• 二元樹中,如果X的左子樹是空的,
我們就視為X的左兒子接了一個外節點。
• 右子樹亦然
S-value
• 也叫做rank (秩)
• S(X) 定義為距離X最近的外節點的距離
• 重要性質 :
• 一棵樹至少有 𝟐𝒔(𝒓𝒐𝒐𝒕) − 𝟏 個點
• 證明 :
• 至少有 1 個點的S-value是 s(root)
• 至少有 2 個點的S-value是 s(root)-1
• ……
左偏樹
1. 它是一顆二元樹 (堆的性質)
2. 每個節點的數值不大於其父親之值 (堆的性質)
3. 對於每個點,右子樹的S-value不大於左子樹的S-value
• 因此才叫做左偏
• 根據這個性質,左偏樹上的S-value,等於一直往右小孩走,走到外節 點的距離。
示意圖
右邊很短!
• 𝑛 ≥ 2𝑠 𝑟𝑜𝑜𝑡 − 1
• 𝑠 𝑟𝑜𝑜𝑡 ≤ log2 𝑛 + 1
• 也就是 O(log N)
• 左偏樹上的S-value,等於一直往右小孩走,走到外節點的距離。
• 所以右邊很短!
• 這讓我們想往右邊合併去
操作
1. 合併兩棵左偏樹 2. 插入
• 把新節點視為一棵樹,將兩棵樹合併
3. 刪除最小值
• 將根刪除,把左右子樹合併
合併
• 合併𝑇1, 𝑇2 兩棵左偏樹 (假設𝑇1的根較小)
1. 將 𝑇1 的根保持為新左偏樹的根,𝑇1的右子樹和𝑇2遞迴合併 2. 檢查𝑇1是否還符合左偏樹性質
(右子樹的S-value不大於左子樹的S-value),
若否,交換左右子樹
為什麼很快
• 令𝐾為需要合併的兩棵左偏樹的S-value和
• K 一開始是 O(log(N)+log(M))
• 每次遞迴下去一次,K就會減少1
• 所以複雜度是 O(log(N)+log(M))
練習題
• https://tioj.ck.tp.edu.tw/problems/1429
• 可以用啟發式合併
• 可以用左偏樹
• 可以用黑魔法
• 本人實測
• 左偏樹最快
• 黑魔法次之
• 啟發式合併最慢
• 但是其實也沒差多少XD
Flood fill
淹水
• 模擬「淹水」的過程很麻煩,幾個方向就要寫幾個很大串的 if,
怎麼辦?
• 提示:有沒有發現所有的 if 其實都長得很像?
淹水
int dx[4] = [-1,0,0,1];
int dy[4] = [0,-1,1,0];
for(int i = 0 ; i < 4; i++)
if(check(x + dx[i], y + dy[i]))
queue.push(x + dx[i], y + dy[i]);
Graph
存圖
• 當我們需要動態加邊的時候,該怎麼做?
• 當我們需要刪邊的時候,該怎麼做?
• 還有很多有趣的存圖方式!
• 其實應該算是原本那兩種的變種
• 其實也沒有很有趣
存圖
• 相鄰串列
• 相鄰矩陣
• 二元搜尋樹
比較
• 相鄰矩陣
• 空間複雜度:O(V2)
• 查詢兩個點之間是否有邊:O(1)
• 遍歷一個點v周圍的邊:O(V)
• 增加一條邊:O(1)
• 刪除一條邊:O(1)
• 相鄰串列
• 空間複雜度:O(V+E)
• 查詢兩個點之間是否有邊:O(deg)
• 遍歷一個點v周圍的邊:O(deg)
• 增加一條邊:O(1)
• 刪除一條邊:O(deg)
比較
• 二元搜尋樹
• 空間複雜度:O(V+E)
• 查詢兩個點之間是否有邊:O(log(deg))
• 遍歷一個點v周圍的邊:O(deg)
• 增加一條邊:O(log(deg))
• 刪除一條邊:O(log(deg))
• 通常會使用相鄰串列
• 點數很少時會使用相鄰矩陣
• 特殊需求時(?)會使用二元搜尋樹
用不太到的思考題
Alice and Bob
• 有一個遊戲,Alice跟Bob要有限度的心電感應。
• Alice跟Bob可以事前溝通,他們也知道每一回合的形式。
• 主持人會公開N,代表圖中有N個點。
• Alice會看到主持人的圖,Bob則看不到
Alice and Bob
• 有一個遊戲,Alice跟Bob要有限度的心電感應。
• Alice跟Bob可以事前溝通,他們也知道每一回合的形式。
• 主持人會公開N,代表圖中有N個點。
• Alice會看到主持人的圖,Bob則看不到
• ROUND 1:主持人給定一張圖,Alice可以傳一個𝑁2個字元的 0/1字串給Bob,而Bob必須要還原出主持人的圖
Alice and Bob
• 有一個遊戲,Alice跟Bob要有限度的心電感應。
• Alice跟Bob可以事前溝通,他們也知道每一回合的形式。
• 主持人會公開N,代表圖中有N個點。
• Alice會看到主持人的圖,Bob則看不到
• ROUND 2:主持人給定一棵樹,Alice可以傳一個𝑁𝑙𝑔𝑁個字元 的0/1字串給Bob,而Bob必須要還原出主持人的樹
Alice and Bob
• 有一個遊戲,Alice跟Bob要有限度的心電感應。
• Alice跟Bob可以事前溝通,他們也知道每一回合的形式。
• 主持人會公開N,代表圖中有N個點。
• Alice會看到主持人的圖,Bob則看不到
• ROUND 3:主持人給定一棵樹,Alice可以傳一個2𝑁個字元的 0/1字串給Bob,而Bob必須要還原出主持人的樹的長相
Number of binary tree
想想看
• 今天給你N個相異元素,要求你用這些元素做出一個Heap
• 這個Heap必須是binary tree
• 但是不必是complete binary tree
• 這是合法的
• 請問可以做出幾種Heap
• 答案是 𝑁! 為甚麼呢?
想想看
• 今天給你N個相異元素,要求你用這些元素做出一個BST (binary search tree)
• 請問可以做出幾種BST
• 卡塔蘭數
• 有興趣請自行上網搜尋