Heap/Flood Fill/Basic Graph
2019/03/30
Lecture By zolution
Credit by qazwsxedcrfvtg14
Before We Start
• 今天會有大量的討論時間
• 不是競賽導向的題目
• Brainstorming
• 找好你的partner,2-3人一組
Heap
課程影片
• 看了嗎?
• Q&A
Heap 小知識
世界上的Heap有很多種
• 影片中介紹的Binary heap
• Binomial heap
• Pairing heap
• Thin heap
• Fibonacci heap
• ……
Heap 小知識
• 為什麼會有這麼多種Heap?
• 有的常數比較小
• 有的可以O(1)插入
• 有的可以O(1)刪除
• 有的可以O(logN)合併??
• 有的可以O(1)合併??!!
• 因為礙於篇幅,有興趣請自行上網查詢資料:P
Heap 合併
I have a heap.
I have another heap.
Uhh!
A bigger heap!
Heap 合併
• Heap合併是什麼?
• 簡單來說就是把兩個Heap變成一個Heap
模擬情況
• 現在有N個Heap,有三種操作
• 把一個元素Push進其中一個Heap
• 從一個Heap中Pop元素
• 合併兩個Heap
• 假設總操作數最多Q次,總元素數最多為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
魔法
• 幾個在C++中關於Heap的魔法
• 白魔法
• 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
Discussion
• Insertion of Heap: O(logN)
• 所以Build a heap of N element: O(NlogN)
• 很合理啊?!!!
• 其實這個bound不夠緊,可以壓到O(N)
• HOW?
•
Flood fill
課程影片
• Q&A
淹水
• 模擬「淹水」的過程很麻煩,幾個方向就要寫幾個很大串的 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]);
想一想
• 可不可以用 DFS 來做例題一(染色問題)?
• 可不可以用 DFS 來做例題二(喵喵抓老鼠)?
• 有沒有什麼壞處?
• 複雜度是多少呢?
• 如果題目是,每個格子都有一個高度值,高度值低於一定程度就 會淹水,請問到最後會有幾塊水窪?
• 用 BFS 可以做嗎?
• 用 DFS 可以做嗎?
A* Search
Credit to Theory of Computer Games, 2018 Fall
A*
• A-star Algorithm
• 估算最好的選擇會是哪一個state,就先搜他
• BFS with Heap!
• f(x) = g(x) + h(x)
• f(x): Evaluation Function(評價)
• g(x): Cost Function(實際已花費)
• h(x): Heuristic Function(估算未來需要多少Cost)
Normal BFS
A*
A*
• 常在爆搜的情境下用到
• 節省不必要,偏差的State,先搜最有可能的State
• 走迷宮:會Prefer往終點方向的State
• 下棋:會Prefer己方子力大的State
• 解Puzzle:Prefer靠近解答的Move
• f(x) = g(x) + h(x)
• f(x): Evaluation Function(評價)
• g(x): Cost Function(實際已花費)
• h(x): Heuristic Function(估算未來需要多少Cost)
Heuristic Function
• 想一想,走迷宮的時候你會怎麼設計Heuristic Function?
• 歐幾里德距離?
• 曼哈頓距離?
• 當h(x)等於0時,等同BFS
• 那DFS呢?
• f(x) = g(x) + h(x)
• f(x): Evaluation Function(評價)
• g(x): Cost Function(實際已花費)
• h(x): Heuristic Function(估算未來需要多少Cost)
Discussion
• A* 一定會找到最佳解嗎?有條件限制嗎?
• f(x) = g(x) + h(x)
• f(x): Evaluation Function(評價)
• g(x): Cost Function(實際已花費)
• h(x): Heuristic Function(估算未來需要多少Cost)
Admissible Heuristic
• Admissible Heuristic: Never “Overestimate”
• 不高估的狀況下,f(x)永遠不會比真實需要的最小值還大
• 根據Min-Heap,這個點一定會被搜到,且是最佳解
• We need a lower bound estimation that is as large as possible (T.S. Hsu, 2018)
• f(x) = g(x) + h(x)
Discussion
• Consider Sokoban Game 倉庫番
• 請與你的組員設計一個Heuristic Function,估算還需要多少 Cost才能將箱子推到終點
• f(x) = g(x) + h(x)
• f(x): Evaluation Function(評價)
• g(x): Cost Function(實際已花費)
• h(x): Heuristic Function(估算未來需要多少Cost)
Discussion
• Consider Sokoban Game 倉庫番
• 請與你的組員設計一個Heuristic Function,估算還需要多少 Cost才能將箱子推到終點
• 有沒有一些狀態可以事先剪枝的?
A*
• 優缺點節省不必要,偏差的State,先搜最有可能的State
• 走迷宮:會Prefer往終點方向的State
• 下棋:會Prefer己方子力大的State
• f(x) = g(x) + h(x)
• f(x): Evaluation Function(評價)
• g(x): Cost Function(實際已花費)
• h(x): Heuristic Function(估算未來需要多少Cost)
Discussion
• A* 一定會找到最佳解嗎?有條件限制嗎?
• f(x) = g(x) + h(x)
• f(x): Evaluation Function(評價)
• g(x): Cost Function(實際已花費)
• h(x): Heuristic Function(估算未來需要多少Cost)
Graph
課程影片
• Q&A
存圖
• 當我們需要動態加邊的時候,該怎麼做?
• 當我們需要刪邊的時候,該怎麼做?
• 還有很多有趣的存圖方式!
• 其實應該算是原本那兩種的變種
存圖
• 相鄰串列
• 相鄰矩陣
比較
• 相鄰矩陣
• 空間複雜度:O(V2)
• 查詢兩個點之間是否有邊:O(1)
• 遍歷一個點v周圍的邊:O(V)
• 增加一條邊:O(1)
• 刪除一條邊:O(1)
• 相鄰串列
• 空間複雜度:O(V+E)
• 查詢兩個點之間是否有邊:O(degree(V))
• 遍歷一個點v周圍的邊:O(degree(V))
• 增加一條邊:O(1)
• 刪除一條邊:O(degree(V))
想想看
• 給你一張有向圖,要怎麼知道這張圖上面有沒有環?
• DFS?
• BFS?
想想看
• 現在有一個工廠,裡面有很多台機器,有些機器所生產 的東西可能會依賴於其他機器,但是保證不會循環。
• 問:找出一個機器的執行順序使得過程中不會有機器依賴 於還沒執行過的機器。
• 拓樸排序!
• 有向無環圖(DAG)
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可以傳一個N^2個字元 的0/1字串給Bob,而Bob必須要還原出主持人的圖
Alice and Bob
• 有一個遊戲,Alice跟Bob要有限度的心電感應。
• Alice跟Bob可以事前溝通,他們也知道每一回合的形式。
• 主持人會公開N,代表圖中有N個點。
• Alice會看到主持人的圖,Bob則看不到
• ROUND 2:主持人給定一棵樹,Alice可以傳一個NlgN個字元 的0/1字串給Bob,而Bob必須要還原出主持人的樹
Alice and Bob
• 有一個遊戲,Alice跟Bob要有限度的心電感應。
• Alice跟Bob可以事前溝通,他們也知道每一回合的形式。
• 主持人會公開N,代表圖中有N個點。
• Alice會看到主持人的圖,Bob則看不到
• ROUND 3:主持人給定一棵樹,Alice可以傳一個2N個字元的 0/1字串給Bob,而Bob必須要還原出主持人的樹的長相