Michael Tsai
2010/12/10
今日菜單
•
上次還沒講完的 AOE 網路•
Sorting•
定義•
最快可以 sort 多快 ?•
Insertion Sort•
Quick Sort•
Merge Sort•
Heap Sort2
Activity-on-edge (AOE) Network
•
不是 Ages of Empires ( 爛梗 )•
“Activities” 發生在 edge 上•
edge cost= 所需要完成 activity 的時間•
例如 : vertex 4 可以解釋為完成及 後的時間•
1
2
0 4
6
7
8
3 5
start
finish
�
1=6
�
4=1
�
3=5
�
6= 2
�
9= 4
�
5=1
�
7= 9
�
10=2
�
11= 4
�
8=7
�
2= 4
可以思考的一些問題
• vertex 8= 完成所有工作 . 完成的時間為 ?
• 完成的時間為從 start finish 的最長 path.
• 又稱為 critical path
• 想想看為什麼 ?
• earliest time(edge e): 為該 activity 最早可以開始的時間
• latest time(edge e):
不延誤最後完成時間的前提下 activity 可以開始的最晚時間
• earliest time(e) == latest time(e)
• then e 為 critical activity
• ( 完全不能延誤 )
4
1
2
0 4
6
7
8
3 5
start
finish
�
1=6
�
4=1
�
3=5
�
6= 2
�
9= 4
�
5=1
�
7= 9
�
10=2
�
11= 4
�
8=7
�
2= 4
AOE Network
ee [0] [1] [2] [3] [4] [5] [6] [7] [8] stac k 1
2
0 4
6
7
8
3 5
start
finish
�
1=6
�
3=5
�
6= 2
�
9= 4
�
5=1
�
7= 9
�
11= 4
�
8=7
�
2= 4
Initia l
0 0 0 0 0 0 0 0 0 [0]
0 0 6 4 5 0 0 0 0 0 [3 2
3 0 6 4 5 0 7 0 0 0 1][5 2
5 0 6 4 5 0 7 0 11 0 1][2 1]
ee[i]=i-th event’s earliest event time
<k,l> then e(i)=ee[k]
2 0 6 4 5 5 7 0 11 0 [1]
1 0 6 4 5 7 7 0 11 0 [4]
AOE Network
6
1
2
0 4
6
7
8
3 5
start
finish
�
1=6
�
4=1
�
3=5
�
6= 2
�
9= 4
�
5=1
�
7= 9
�
10=2
�
11= 4
�
8=7
�
2= 4
ee [0] [1] [2] [3] [4] [5] [6] [7] [8] stac
1 0 6 4 5 7 7 0 11 0 k[4]
4 0 6 4 5 7 7 16 14 0 [7 6]
7 0 6 4 5 7 7 16 14 18 [6]
6 0 6 4 5 7 7 16 14 18 [8]
接下來怎麼算 e(i)?
AOE Network
•
用 reverse topological order 來依序算出•
請同學來算算看•
1
2
0 4
6
7
8
3 5
start
finish
�
1=6
�
4=1
�
3=5
�
6= 2
�
9= 4
�
5= 1
�
7= 9
�
10=2
�
11= 4
�
8=7
�
2= 4
Activit
y e l l-e
(slack) l-e=0
0 0 0 Yes
0 2 2
0 3 3
6 6 0 Yes
4 6 2
5 8 3
7 7 0 Yes
7 7 0 Yes
7 10 3
16 16 0 Yes
14 14 0 yes
Activit
y e l l-e
(slack) l-e=0
0 0 0 Yes
0 2 2
0 3 3
6 6 0 Yes
4 6 2
5 8 3
7 7 0 Yes
7 7 0 Yes
7 10 3
16 16 0 Yes
14 14 0 yes
8
1
2
0 4
6
7
8
3 5
start
finish
�
1=6
�
4=1
�
3=5
�
6= 2
�
9= 4
�
5=1
�
7= 9
�
10=2
�
11= 4
�
8=7
�
2= 4
Sorting
• 定義 :
• 有等 n 個 record
• 每個 record 有個 key.
• 我們會定義對 key 們定義 >, =, <
• 這些 operations 是 transitive, 就是說 a>b, b>c 的話 , a>
c
• 要找到一個的排列使得
• 1.
• 2. if i<j and ,then precedes
• 如果同時兩個條件成立則此 sorting 方法為 stable.
•
Sorting 有什麼用 ?
•
例子一 : 在一個 list 裡面找東西 .•
如果沒有 sort 過 , 要怎麼找 ?•
答 : 只能苦工 , 從頭找到尾 •
那如果 sort 過呢 ?•
繼續苦工的話有幫助嗎 ?•
有 . 可以提早知道要找的數字不在裡面 .•
也可以 binary search •
但是 , sorting 本身要花多少時間呢…•
10
Sorting 有什麼用 ?
•
例子二 : 比對兩個 list 有沒有一樣 ( 列出所有不一樣的 item). 兩個 lists 分別有 n 與 m 個 items.•
如果沒有 sort 要怎麼找呢 ?•
list 1 的第 1 個 , 比對 list 2 的 1-m 個•
list 1 的第 2 個 , 比對 list 2 的 1-m 個•
…•
list 1 的第 n 個 , 比對 list 2 的 1-m 個•
所以需要•
Sorting 有什麼用 ?
•
如果 sort 過呢 ?•
可以利用類似之前講過 polynomial 加法的方法 .•
( 請同學回憶並解釋 ?)•
可參考課本 program 7.3 (p.337)•
則需要花多少時間來比對 ?•
不要忘了還有 sorting 的時間•
所以 sorting 究竟要花多少時間呢 ?•
12
Sorting 的分類
•
Internal Sort: 所有的資料全部可以一股腦地放在記憶體 裡面•
External Sort: 資料太大了 , 有些要放到別的地方 ( 硬 碟 , 記憶卡 , 網路上的其他電腦上 , 等等等 )•
我們只講 internal sort 的部分•
現在電腦 ( 及如手機 , iPod, iPad 等各種計算裝置 ) 記 憶體越來越大 , 越來越便宜 , 比較少有機會使用 externa l sort.•
有興趣的同學可以看一看課本 7.10 (p.376)到底我們可以 sort 多快 ?
•
假設我們使用”比較” +” 交換”的方法 .•
“ 比較” : 看 list 裡面的兩個 item 誰大誰小•
“ 交換” : 交換 / 移動兩個 item 在 list 裡面的位置•
如何歸納出”最差的狀況要花多少時間 sort?”�
1≤ �
2�
2≤ �
3�
1≤ �
3�
1≤ �
3�
2≤ �
3stop stop
stop
stop
stop stop
[1,2,3]
[1,3,2]
[1,2,3]
[1,2,3]
[1,3,2]
[2,3,1]
[2,1,3]
[2,1,3]
[3,1,2]
[3,1,2] [3,2,1]
課本 p.344 的 Figure 7.2 好
Yes No 像有錯
14
•
每個 node 代表一個 comparison 及 swap•
到達 leaf 時表示 sorting 完畢•
共有幾個 leaf?•
共有 n 個 items 的所有可能排列數目 :•
�
1≤ �
2�
2≤ �
3�
1≤ �
3�
1≤ �
3stop stop
stop
stop
stop stop
[1,2,3]
[1,3,2]
[1,2,3]
[1,2,3]
[1,3,2]
[2,3,1]
[2,1,3]
[2,1,3]
[3,1,2] [3,2,1]
�
2≤ �
3到底我們可以 sort 多快 ?
•
所以 , worst case 所需要花的時間 , 為此 binary tree 的 height.•
Binary tree 的性質 : 如果 height 為 k, 則最多有個 lea ves•
所以有個 leaves 的話 , 至少 height 為•
結論 : 任何以”比較”為基礎的 sorting algorithm wors t-case complexity 為 .•
< 動腦時間 > 如何證明 average complexity 也是 ?•
答 : 算算看 leaf 到 root 的 distance 的平均值 .•
16
Insertion sort
•
方法 : 每次把一個 item 加到已經排好的 , 已經有 i 個 it em 的 list, 變成有 i+1 個 item 的排好的 list2 3 6 5 1 4
2 3 6 5 1 4
2 3 6 5 1 4
2 3 5 6 1 4
2 3 5 6 1 4
1 2 3 5 6 4
1 2 3 5 6 4
1 2 3 4 5 6
Insertion Sort
• 要花多少時間 ?
• 答 : 最差的狀況 , 每次都要插到最末端 ( 花目前 sorted 大小的時間 )
• 平均 complexity, 也是 .
• 變形 ( 蟲 ):
• 1. 在找正確的應該插入的地方的時候 , 使用 binary searc h. ( 但是移動還是
• 2. 使用 linked list 來表示 整個 list 的 item, 則插入時 不需要移動 , 為 . ( 但是尋找插入的地方的時候還是需要 )
•
18
Quick Sort
•
方法 : 每次找出一個 pivot( 支點 ), 所有它左邊都比它 小 ( 但是沒有 sort 好 ), 所有它右邊都比它大 , 然後再 c all 自己去把 pivot 左邊與 pivot 右邊排好 .26 5 37 1 61 11 59 15 48 19
26 5 37 1 61 11 59 15 48 19
26 5 19 1 61 11 59 15 48 37
26 5 19 1 15 11 59 61 48 37
11 5 19 1 15 26 59 61 48 37
Quick Sort
20
11 5 19 1 15 26 59 61 48 37
1 5 11 19 15 26 59 61 48 37
1 5 11 19 15 26 59 61 48 37
1 5 11 15 19 26 59 61 48 37
1 5 11 15 19 26 59 61 48 37
1 5 11 15 19 26 48 37 59 61
1 5 11 15 19 26 37 48 59 61
1 5 11 15 19 26 37 48 59 61
先大概算一下
•
大約是•
接下來要稍微嚴謹一點證明 :•
有點長的證明
•
用歸納法•
首先 :•
假設 and .•
n=2 時 ,•
假設時 ,•
22
有點長的證明
•
Quick Sort 的其他性質
•
但是 Worst case 時所需時間還是•
想想看 , 什麼時候會變成這樣呢 ?•
答 : 每次 pivot 都是最大的 . (or 每次都是最小的 )•
所需空間 :•
需要 stack ( 處理 recursive call 用 )•
stack 需要多大呢 ?•
Worst case: 需要•
24
Merge Sort
•
先看看 : 要怎麼把兩個已經排好的 list merge 成一個 ?•
請同學講講看 也類似於之前 polynomial 加法•
所花時間 :•
Merge sort 版本一•
方法 : 每個 item 一開始當作一個有一個 item 已經排好的 list•
然後每次把兩個 merge 成一個•
一直到全部變成一個 list 為止•
Merge sort
26
26 5 77 1 61 11
5 26 1 77 11 61
1 5 26 77 11 61
1 5 11 26 61 77
pass 1
pass 2
pass 4 pass 3
Merge sort
•
每個 pass, 正好每個 item 都 process 了一次 (worst cas e). 所以為•
總共需要多少 pass 呢 ?•
每次數量減少一半•
所以需要 passes.•
總共所需時間為•
需要額外的空間來 sorting•
使用兩組跟 n 一樣大的空間 , 交互存入 merge 過後的 list•
也可以用 recursive 的方法寫 . 請參見 program 7.10 (p.350)
•
Heap Sort
•
方法 : 用 minimum heap 或 maximum heap 來 sort list.使用所有 item( 的 key) 來建立 heap. 之後每次從 heap 取 出一個 item, 放入 sorted list. 則拿完以後就 sorting 完畢 .
•
1. 稍微改變一下 : 是否可以做到不用額外空間來建 heap 呢 ?•
可以 . array of items 想是 binary tree.28
5 77
48 19
15
1 61 11 59
這些不用 check, 因為沒有 children
[2] [3]
[4]
[5] [6] [7]
[8] [9] [10]
從 n/2 之前開始往回 check,
只要檢查該 node 為 root 的 binary tree 是否為 heap 即可 .
接下來只要每次把 root 跟最後一個 node 交換 重新整理維持 heap 即可 .
當拿完以後就是完成 sorting 時 . ( 過程可參考課本 figure 7.8 p 355)
Heap sort
• 兩個步驟 :
• 1. 一開始建 heap
• 2. 每次拿一個 item 出來
• 1. 開始建 heap 的時候
• 花的時間為
• 2. 每次拿一個 item 出來 , 花
• 總共 n-1 次 , 共
• 只需要少數額外空間 .
•
30
第 k 層有幾個 node
第 k 層到 leaf 的 distance
比較四大金剛
• Insertion sort: n 小的時候非常快速 . ( 因為常數 c 小 )
• Quick sort: average performance 最好
• Merge sort: worst-case performance 最好
• Heap sort: worst-case performance 不錯 , 且不用花多的空間
• 可以 combine insertion sort 和其他 sort
• 怎麼 combine?
• 答 : 看 n 的大小決定要用哪一種 sorting algorithm.
Worst Average
Insertion sort Heap sort Merge sort Quick sort
Worst Average
Insertion sort Heap sort Merge sort Quick sort
Sorting on several keys
• 假設 K 有很多個 sub-key
• 則 iff
• for some , or
• 則我們可以有以下的 sorting 方法 .
• 先依照 most significant key sort, 然後依序往 least significan t key sort 過去 : Most Significant Digit first (MSD) sorting
• 先依照 least significant key sort, 然後依序往 most significan t key sort 過去 : Least Significant Digit first (LSD) sorting
•
32
Most significant key Least significant key
Sorting on several keys
•
哪一種比較好 ?•
如果使用 stable sorting algorithm, 則 LSD sort 比較 單純•
sort 成”一桶一桶”以後不需要分開 sort•
用黑板舉例吧 ~~ ( 投影片做到發瘋了 )Radix Sort
• 方法 : 每次用某種方法把 items 分為 r 堆 . 然後再 concaten ate 起來 .
• 怎麼分為 r 堆 ?
• 舉例 : 每次使用某一位數的數字分堆 .
• 第一次依照個位數分為十堆 , 然後再放在一起 .
• 第二次依照十位數分為十堆 , 然後再放在一起 .
• …
• 直到完成 ( 共 d 個 pass).
• 最後放在一起的 items 即為 sort 好的 list.
• 用黑板舉例 .
•
34