• 沒有找到結果。

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有很多種

• 影片中介紹的Binary heap

• Binomial heap

• Pairing heap

• Thin heap

• Fibonacci heap

• ……

(5)

Heap 小知識

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

• 有的常數比較小

• 有的可以O(1)插入

• 有的可以O(1)刪除

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

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

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

(6)

Heap 合併

(7)

Heap 合併

• Heap合併是什麼?

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

(8)

模擬情況

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

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

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

• Merge : 合併兩個Heap

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

(9)

Heap 合併

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

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

• 合併呢?

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

• 複雜度O(Q*NlogN)

(10)

Heap 合併

• 那我們換一種方式

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

• 複雜度?

• O(Q*NlogN)

• QQ

(11)

Heap 合併

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

• 複雜度?

• O(Q*NlogN)…?

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

• 啟發式合併!

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

(12)

示意圖

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

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

(13)

魔法

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

• STL

• std::priority_queue

• 黑魔法

• __gnu_pbds::priority_queue

(14)

std::priority_queue

• #include <queue>

• std::priority_queue<int> pque;

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

(15)

__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

• 如果一開始就已經有所有元素了,要建造出一個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=1

2

(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

• 也叫做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)

右邊很短!

• 𝑛 ≥ 2𝑠 𝑟𝑜𝑜𝑡 − 1

• 𝑠 𝑟𝑜𝑜𝑡 ≤ log2 𝑛 + 1

• 也就是 O(log N)

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

• 所以右邊很短!

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

(26)

操作

1. 合併兩棵左偏樹 2. 插入

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

3. 刪除最小值

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

(27)

合併

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

1. 將 𝑇1 的根保持為新左偏樹的根,𝑇1的右子樹和𝑇2遞迴合併 2. 檢查𝑇1是否還符合左偏樹性質

(右子樹的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跟Bob要有限度的心電感應。

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

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

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

(40)

Alice and Bob

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

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

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

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

• ROUND 1:主持人給定一張圖,Alice可以傳一個𝑁2個字元的 0/1字串給Bob,而Bob必須要還原出主持人的圖

(41)

Alice and Bob

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

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

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

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

• ROUND 2:主持人給定一棵樹,Alice可以傳一個𝑁𝑙𝑔𝑁個字元 的0/1字串給Bob,而Bob必須要還原出主持人的樹

(42)

Alice and Bob

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

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

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

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

• ROUND 3:主持人給定一棵樹,Alice可以傳一個2𝑁個字元的 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

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

In digital systems, a register transfer operation is a basic operation that consists of a transfer of binary information from one set of registers into another set of

Heap/BFS/Basic

Natural Terrain Landslide Risk Mitigation Measures at Yu Tung Road, Tung Chung.. Natural Terrain Landslide Risk Mitigation Measures at Yu Tung Road,

Microphone and 600 ohm line conduits shall be mechanically and electrically connected to receptacle boxes and electrically grounded to the audio system ground point.. Lines in

even if bound changes on non-binary variables are present, such a subset can be used like the conflict detecting clause in SAT to represent the conflict in the conflict graph..