• Tidak ada hasil yang ditemukan

臺北市立建國高級中學

N/A
N/A
Protected

Academic year: 2023

Membagikan "臺北市立建國高級中學"

Copied!
1
0
0

Teks penuh

(1)

演算法 與 資料結構 Algorithm and Data Structure

- Heap & Disjoint Set 堆與獨立集

Heap 堆(最小堆與最大堆)

這部分又是講有關資料結構囉。一個最常見的資料結構之一就是Heap,今天介紹的是最普通 的Min-Heap和Max-Heap。一個Heap其實就是個binary tree(注意,不是Binary Search

Tree),而注意他是個complete binary tree(由上到下、由左到右是填滿的),所以可以直接

用陣列和節點編號來模擬。而在Min-Heap中,每個節點中的值都小於等於以它為root的子樹 中所有節點的值。這樣的性質有助於我們快速的插入、刪除值,以及查找最小值。

由於Min-Heap和Max-Heap為本質一樣的資料結構,以下皆以Min-Heap為例。

Properties

‧為一complete binary tree,根節點編號為1,一直到編號為n的節點(總共為n個元素)。其

中編號為k的節點,其左子孫(若有)為2*k,其右子孫(若有)為2*k+1。

‧對於每個節點,最主要有一個值稱為key(鍵值)用來決定它在heap中的位置;而其他和 這個節點有關的資料但對資料結構沒有影響的則稱為satellite data。

‧每個節點key值小於等於起子孫之key值。事實上,小於等於整個以它為根的子樹中任一節 點的key值。因此,根節點其實就是key值最小的一個點!

‧通常支持以下操作:O(lgn)的Insertion和Deletion,O(1)的Find-Min。

Implementing and Maintaining a Heap

誠如以上所說,由於heap為一complete binary tree,我們可以用陣列模擬它。

我們用一變數heapnum紀錄目前heap中有幾個元素,以及一個陣列Heap[]來儲存資料。

注意在implement一個heap的時候,若要支持Deletion的操作,則我們還必須要一個

HeapPos[]陣列來紀錄某個資料目前在Heap中的什麼位置。

而一個Heap通常有以下操作:(某些其實只是輔助性,例如Min-Heapify只為了Extract- Min)

最小堆化Min-Heapify(x) (由於其動作為向下遞歸,亦有稱為Heap-Down)– O(lgn)

當以Heap[x]parent的兩個subtree都符合heap之性質時(但x節點可能大於其子孫),

x以下變成符合heap的性質。

MIN-HEAPIFY (x) 1 lx  2 2 rx  2 + 1

3 if l n and Heap[l].key < Heap[x].key 4 then min l

5 else min x

6 if r n and Heap[r].key < Heap[min].key 7 then min ← r

8 if minx

建中資訊培訓講義 (六) - by kelvin

(2)

9 then exchange Heap[x] ↔ Heap[min]

10 MIN-HEAPIFY(min)

上移元素Heap-Up(x) (和Heap-Down相反,其動作為向上遞歸)– O(lgn)

Heap[x]key值可能小於其parentkey值時,把Heap[x]往上移使heap性質得以維持。

HEAP-UP (x)

1 while x > 1 and Heap[x]<Heap[PARENT(x)]

2 do exchange Heap[x] ↔ Heap[PARENT(x)]) 3 x ← Parent(x)

插入Insert(v) – O(lgn)

把一資料v增加到heap中。

INSERT (v) 1 nn + 1 2 Heap[n] ← v 3 HEAP-UP (n)

刪除Delete(x) – O(lgn) 把位置為x的元素刪除 DELETE (x)

1 exchange Heap[x] ↔ Heap[n]

2 nn – 1

3 if x > 1 and Heap[x] < PARENT(x) 4 then HEAP-UP (x)

5 else MIN-HEAPIFY (x)

查找最小值Find-Min() – O(1)

回傳Heap中有最小值key值的元素 FIND-MIN ()

1 return Heap[1]

查找並刪除最小值Extract-Min() – O(lgn)

EXTRACT-MIN () 1 minHeap[n]

2 DELETE (1) 3 return min

Disjoint Set 獨立集(Union-Find

在獨立集中有若干個元素,每個元素屬於某個集合Si,而每個集合Si則由其中的一個元素來 代表,這個元素稱為representative。

Properties

‧每個集合由一representative代表,進行Find-Set時,同集合元素會找到同一representative。

建中資訊培訓講義 (六) - by kelvin

(3)

‧通常支持以下操作:Make-Set、Find-Set、Union。

‧Union Find的均攤分析(amortized analysis)時間複雜度為O(m(n)),其中m為總共進行

了幾次Union-Find操作,n為元素總數,(n)為一函數,其值在合理n值範圍內幾乎可以

視為常數(5)。

Concept of Disjoint Set

Disjoint Set看起來其實會是一個forest(稱為disjoint set forest),每個tree就是一個set,而

tree的root則是該set的representative。為此,每個元素節點紀錄有一個parent。由此,查找一

個元素其所屬的set時,往上找到這棵樹的root就是該元素所屬的set的representative了。而 union時則是把其中一個set的representative之parent改設為另一set的representative。

但為了使Union-Find operation具有均攤分析為O(m(n))的時間複雜度,我們在進行操作時

還有兩個重要的策略:union by rankpath compressing

‧Union by rank

要使查找時所需的時間小,一個很直接的想法,是希望disjoint set forest中的tree其成員數 目的高度總和越小越好。為此,我們希望合併兩個set(進行union操作)時,把元素數比較 少的樹的root接到比較多的樹之下。當然我們可以詳細的紀錄每個set的元素樹,但為了 analysis所需,對於每個set的representative我們紀錄一個rank,代表這個set高度的最大上 限。而在合併時,我們把rank小的接在rank大的representative之下。

當然,這個rank可能因為在進行path compressing之後變成不盡正確,不過我們只是為了概 略的降低時間複雜度(這有助於其時間複雜度的證明),既然不影響正確性,這是沒有關係 的。

‧Path Compressing

再想想,當我們在Find-Set時,要不斷的查找元素的parent最後才能「追到」root,但如果做 了很多次查找,這樣不是很浪費時間嗎?因此,每次查找我們就把沿途上所有的點都改指到 root上,這樣下次再查找到這些點時,只要往上找一層就找到了representative!

Implementing and Maintaining a Disjoint Set

每個元素maintain其parent,至於representative的parent則是它自己。

Disjoint Set支持以下的操作:

建立集合Make-Set(x)

建立一個只有一個元素x的集合。

MAKE-SET (x) 1 x.parent ← x 2 x.rank ← 0

合併Union(x, y)

把一資料v增加到heap中。

UNION (x, y)

1 LINK (FIND-SET(x), FIND-SET(y))

建中資訊培訓講義 (六) - by kelvin

(4)

LINK (x, y)

1 if x.rank > y.rank 2 then y.parent ← x 3 else x.parent ← y 4 if x.rank = y.rank

5 then y.rank ← y.rank +1

查找Find-Set(x)

查找x屬於哪個set,回傳x所屬setrepresentative

FIND-SET (x) 1 if x.parent  x

2 then x.parent ← FIND-SET (x.parent) 3 return x.parent

尾聲

原則上,array、linked list、stack、queue、binary search tree、heap、disjoint set,這些算是比較

elementary的資料結構,目前能掌握這些資料結構的應用,就能解決很多問題了!

但資料結構非常非常多,之後也許還會遇到trie、suffix trie、segmant tree和各式各樣的資料結 構,除了學習以外,其實資料結構並不是死的,對於特定的目的和希望能夠進行的操作,也 可以嘗試自己設計一些符合需求的資料結構。如果能夠如此的話,那就又更上一層了!

[完]

建中資訊培訓講義 (六) - by kelvin

Referensi

Dokumen terkait

第貳部分、混合題或非選擇題(占15分) 說明:本部分共有1題組,每一子題配分標於題末。限在標示題號作答區內作答。非選擇 題請由左而右橫式書寫,作答時必須寫出計算過程或理由,否則將酌予扣分。 第18至19題為題組 假設某公司經營第x年的獲利函數為三次函數 f x x36x2kx3單位:百萬元,其中 k為一正整數,試回答下列問題:

二十六、 教師研習 時間:2021年12月11日 地點:臺中市立臺中一中科學館 報導:今年度學會以程式融入課程的第二次 教師研習邀請到逢甲通識中心洪耀正教授以 「開發物理實驗APP超簡單」為題給予教師 研習,為方便中部教師參與假臺中一中科學 館辦理。 洪教授以許多長輩使用的佛珠為題引導教師 如何透過手機紀錄佛珠轉動次數,將日常生