• 沒有找到結果。

Heap/Flood Fill/Basic Graph

N/A
N/A
Protected

Academic year: 2022

Share "Heap/Flood Fill/Basic Graph"

Copied!
45
0
0

加載中.... (立即查看全文)

全文

(1)

Heap/Flood Fill/Basic Graph

2021/03/20

Lecture By lawfung

(2)

目錄 目錄

• 合併 Heap

• Heap 黑魔法

• 建立 Heap 的時間複雜度

• 左偏樹

• 思考題

• Number of binary tree

(3)

Heap

(4)

Heap 小知識 Heap 小知識

世界上的 Heap 有很多種

• 影片中介紹的 Binary heap

• Binomial heap

• Pairing heap

• Thin heap

• Fibonacci heap

• ……

(5)

Heap 小知識 Heap 小知識

• 為什麼會有這麼多種 Heap?

• 有的常數比較小

• 有的可以 O(1) 插入

• 有的可以 O(1) 刪除

• 有的可以 O(logN) 合併 ??

• 有的可以 O(1) 合併 ??!!

• 有興趣請自行上網查詢資料

(6)

Heap 合併

(7)

Heap 合併 Heap 合併

• Heap 合併是什麼 ?

• 簡單來說就是把兩個 Heap 變成一個 Heap

(8)

模擬情況 模擬情況

• 現在有 N 個 Heap ,有三種操作

• Push : 把一個元素放進其中一個 Heap

• Pop : 從一個 Heap 中取出最小的元素

• Merge : 合併兩個 Heap

• 假設總操作數最多 Q 次,其中 Push 最多 N 次

(9)

Heap 合併 Heap 合併

• 先不管複雜度,來想個最天真的作法吧 ~

• Push 和 Pop 就照一般的做法做

• 合併呢 ?

• 開一個新的 Heap ,把原先兩個 Heap 的元素一個一個的 push 進 去

• 複雜度 O(Q*NlogN)

(10)

Heap 合併 Heap 合併

• 那我們換一種方式

• 把其中一個 Heap 的元素一個一個的 push 進另外一個 Heap

• 複雜度 ?

• O(Q*NlogN)

• QQ

(11)

Heap 合併 Heap 合併

• 那…如果我們把比較小的 Heap 慢慢加到另外一個 Heap 中呢 ?

• 複雜度 ?

• O(Q*NlogN)…?

• O(Nlog^2(N)+QlogN) ??!!

• 啟發式合併 !

• 考慮對於每一個元素,它每次被併入一個新的集合,它所處集合的大小至少 是原來的兩倍。所以對每個元素至多進行 logN 次合併操作,總複雜度 N*log N*logN

(12)

示意圖 示意圖

黑色 : 需要拿出再放入其他 Heap

紅色 : 當今在的 Heap 被使用為合併後的 Heap

(13)

魔法 魔法

• 幾個在 C++ 中關於 Heap 的魔法

• STL

• std::priority_queue

• 黑魔法

• __gnu_pbds::priority_queue

(14)

std::priority_queue std::priority_queue

• #include <queue>

• std::priority_queue<int> pque;

• priority_queue<int, vector<int>, greater<int> > lque

(15)

__gnu_pbds::priority_queue __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);

(16)

Building Heap 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/

(17)

作法 作法

• 從底層往上,將小的子 Heap 建好後,再將大 Heap 也完成。

• 接下來是要證明複雜度是 O(N)

• 然後使用公式 at x=

•  

(18)

示意圖 示意圖

Height Count

3 1

2 2

1 3

0 8

(19)

Leftist Tree

(20)

為什麼要左偏樹 為什麼要左偏樹

• 可合併堆

• 雖然其實黑魔法也可以

• 合併多快

• O(log(N)+log(M))

(21)

定義 定義

• 外節點 :

• 二元樹中,如果 X 的左子樹是空的,

我們就視為 X 的左兒子接了一個外節點。

• 右子樹亦然

(22)

S-value S-value

• 也叫做 rank ( 秩 )

• S(X) 定義為距離 X 最近的外節點的距離

• 重要性質 :

• 一棵樹至少有 個點

• 證明 :

• 至少有 1 個點的 S-value 是 s(root)

• 至少有 2 個點的 S-value 是 s(root)-1

• ……

•  

(23)

左偏樹 左偏樹

1. 它是一顆二元樹 ( 堆的性質 )

2. 每個節點的數值不大於其父親之值 ( 堆的性質 )

3. 對於每個點,右子樹的 S-value 不大於左子樹的 S-value

• 因此才叫做左偏

• 根據這個性質,左偏樹上的 S-value ,等於一直往右小孩走,走到外節 點的距離。

(24)

示意圖 示意圖

(25)

右邊很短 ! 右邊很短 !

• 也就是 O(log N)

• 左偏樹上的 S-value ,等於一直往右小孩走,走到外節點的距離

• 所以右邊很短 !

• 這讓我們想往右邊合併去

•  

(26)

操作 操作

1. 合併兩棵左偏樹

2. 插入

把新節點視為一棵樹,將兩棵樹合併

3. 刪除最小值

將根刪除,把左右子樹合併

(27)

合併 合併

• 合併 兩棵左偏樹 ( 假設的根較小 )

1. 將的根保持為新左偏樹的根,的右子樹和遞迴合併

2. 檢查是否還符合左偏樹性質

( 右子樹的 S-value 不大於左子樹的 S-value) , 若否,交換左右子樹

•  

(28)

為什麼很快 為什麼很快

• 令為需要合併的兩棵左偏樹的 S-value 和

• K 一開始是 O(log(N)+log(M))

• 每次遞迴下去一次, K 就會減少 1

• 所以複雜度是 O(log(N)+log(M))

•  

(29)

練習題 練習題

https://tioj.ck.tp.edu.tw/problems/1429

• 可以用啟發式合併

• 可以用左偏樹

• 可以用黑魔法

• 本人實測

• 左偏樹最快

• 黑魔法次之

• 啟發式合併最慢

• 但是其實也沒差多少 XD

(30)

Flood fill

(31)

淹水 淹水

• 模擬「淹水」的過程很麻煩,幾個方向就要寫幾個很大串的 if

,怎麼辦?

• 提示:有沒有發現所有的 if 其實都長得很像?

(32)

淹水 淹水

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]);

(33)

Graph

(34)

存圖 存圖

• 當我們需要動態加邊的時候,該怎麼做 ?

• 當我們需要刪邊的時候,該怎麼做 ?

• 還有很多有趣的存圖方式 !

• 其實應該算是原本那兩種的變種

• 其實也沒有很有趣

(35)

存圖 存圖

• 相鄰串列

• 相鄰矩陣

• 二元搜尋樹

(36)

比較 比較

• 相鄰矩陣

• 空間複雜度: O(V2)

• 查詢兩個點之間是否有邊: O(1)

• 遍歷一個點 v 周圍的邊: O(V)

• 增加一條邊: O(1)

• 刪除一條邊: O(1)

• 相鄰串列

• 空間複雜度: O(V+E)

• 查詢兩個點之間是否有邊: O(deg)

• 遍歷一個點 v 周圍的邊: O(deg)

• 增加一條邊: O(1)

• 刪除一條邊: O(deg)

(37)

比較 比較

• 二元搜尋樹

• 空間複雜度: O(V+E)

• 查詢兩個點之間是否有邊: O(log(deg))

• 遍歷一個點 v 周圍的邊: O(deg)

• 增加一條邊: O(log(deg))

• 刪除一條邊: O(log(deg))

• 通常會使用相鄰串列

• 點數很少時會使用相鄰矩陣

• 特殊需求時 (?) 會使用二元搜尋樹

(38)

用不太到的思考題

(39)

Alice and Bob Alice and Bob

• 有一個遊戲, Alice 跟 Bob 要有限度的心電感應。

• Alice 跟 Bob 可以事前溝通,他們也知道每一回合的形式。

• 主持人會公開 N ,代表圖中有 N 個點。

• Alice 會看到主持人的圖, Bob 則看不到

(40)

Alice and Bob Alice and Bob

• 有一個遊戲, Alice 跟 Bob 要有限度的心電感應。

• Alice 跟 Bob 可以事前溝通,他們也知道每一回合的形式。

• 主持人會公開 N ,代表圖中有 N 個點。

• Alice 會看到主持人的圖, Bob 則看不到

• ROUND 1: 主持人給定一張圖, Alice 可以傳一個個字元的 0/

1 字串給 Bob ,而 Bob 必須要還原出主持人的圖

•  

(41)

Alice and Bob Alice and Bob

• 有一個遊戲, Alice 跟 Bob 要有限度的心電感應。

• Alice 跟 Bob 可以事前溝通,他們也知道每一回合的形式。

• 主持人會公開 N ,代表圖中有 N 個點。

• Alice 會看到主持人的圖, Bob 則看不到

• ROUND 2: 主持人給定一棵樹, Alice 可以傳一個個字元的 0/

1 字串給 Bob ,而 Bob 必須要還原出主持人的樹

•  

(42)

Alice and Bob Alice and Bob

• 有一個遊戲, Alice 跟 Bob 要有限度的心電感應。

• Alice 跟 Bob 可以事前溝通,他們也知道每一回合的形式。

• 主持人會公開 N ,代表圖中有 N 個點。

• Alice 會看到主持人的圖, Bob 則看不到

• ROUND 3: 主持人給定一棵樹, Alice 可以傳一個個字元的 0/

1 字串給 Bob ,而 Bob 必須要還原出主持人的樹的長相

•  

(43)

Number of binary tree

(44)

想想看 想想看

• 今天給你 N 個相異元素,要求你用這些元素做出一個 Heap

• 這個 Heap 必須是 binary tree

• 但是不必是 complete binary tree

• 這是合法的

• 請問可以做出幾種 Heap

• 答案 為甚麼呢 ?

•  

(45)

想想看 想想看

• 今天給你 N 個相異元素,要求你用這些元素做出一個 BST (binary search tree)

• 請問可以做出幾種 BST

• 卡塔蘭數

• 有興趣請自行上網搜尋

參考文獻

相關文件

Credit to Theory of Computer Games,

Credit to Theory of Computer Games, 2018 Fall.. Normal BFS

• Definition: A max tree is a tree in which the key v alue in each node is no smaller (larger) than the k ey values in its children (if any). • Definition: A max heap is a

「天下莫柔弱於水,而攻堅強者莫之 能勝,其無以易之。弱之勝強,柔之 勝剛。」. 「天下之至柔,馳騁天下之至堅,

課堂補充 by qazwsxedcrfvtg14...

製作電子文集 bookPress / Flipbook 調適修正、實作分享

Heap/BFS/Basic

Number of