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 6
1
5
2
4 1
9
2
7 4 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 6
1
5
2
4 1
9
2
7 4 4
AOE Network
ee [0] [1] [2] [3] [4] [5] [6] [7] [8] stack
2
0 4
6
7
8
3 5
start
finish 6
5
2
4 1
9 7 4 4
Initial 0 0 0 0 0 0 0 0 0 [0]
0 0 6 4 5 0 0 0 0 0 [3 2 1]
3 0 6 4 5 0 7 0 0 0 [5 2 1]
5 0 6 4 5 0 7 0 11 0 [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 6
1
5
2
4 1
9
2
7 4 4
ee [0] [1] [2] [3] [4] [5] [6] [7] [8] stack
1 0 6 4 5 7 7 0 11 0 [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
•
min ,•
用reverse topological order來依序算出•
請同學來算算看1
2
0 4
6
7
8
3 5
start
finish 6
1
5
2
4 1
9
2
7 4 4
Activity 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 6
1
5
2
4 1
9
2
7 4 4
Sorting
•
定義:•
有 , , , … , 等n個record•
每個record有個key.•
, , , … ,•
我們會定義對key們定義>, =, <•
這些operations是transitive, 就是說 a>b, b>c的話, a>c•
要找到一個 , , , … , 的排列 使得•
1. , 1 1•
2. if i<j and ,then precedes•
如果同時兩個條件成立則此sorting方法為 stable.Sorting有什麼用?
•
例子一: 在一個list裡面找東西.•
如果沒有sort過, 要怎麼找?•
答: 只能苦工, 從頭找到尾 •
那如果sort過呢?•
繼續苦工的話有幫助嗎?•
有. 可以提早知道要找的數字不在裡面.•
也可以binary search log•
但是, 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等各種計算裝置)記憶體越 來越大, 越來越便宜, 比較少有機會使用external sort.•
有興趣的同學可以看一看課本7.10 (p.376)到底我們可以sort多快?
•
假設我們使用”比較”+”交換”的方法.•
“比較”: 看list裡面的兩個item誰大誰小•
“交換”: 交換/移動兩個item在list裡面的位置•
如何歸納出”最差的狀況要花多少時間sort?”stop 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的所有可能排列數目: !stop 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]
到底我們可以sort多快?
•
所以, worst case所需要花的時間, 為此binary tree的height.•
Binary tree的性質: 如果height為k, 則最多有2 個leaves•
所以有 !個leaves的話, 至少height為log ! 1•
! 1 2 … 3 ⋅ 2 ⋅ 1•
log ! log log Ω log•
結論: 任何以”比較”為基礎的sorting algorithm worst‐case complexity為Ω log .•
<動腦時間> 如何證明average complexity也是Ω log ?•
答:算算看leaf到root的distance的平均值.16
Insertion sort
•
方法: 每次把一個item加到已經排好的, 已經有i個item的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
Insertion Sort
•
要花多少時間?•
答: 最差的狀況, 每次都要插到最末端 (花目前sorted大小的 時間)•
∑ 1•
平均complexity, 也是 .•
變形(蟲):•
1. 在找正確的應該插入的地方的時候, 使用binary search. (但 是移動還是•
2. 使用linked list來表示 整個list的item, 則插入時不需要移動, 為 1 . (但是尋找插入的地方的時候還是需要 )18
Quick Sort
•
方法: 每次找出一個pivot(支點), 所有它左邊都比它小(但是 沒有sort好), 所有它右邊都比它大, 然後再call自己去把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
先大概算一下
•
cn 2T cn 2 2T•
log 1 log•
大約是 log•
接下來要稍微嚴謹一點證明:•
log , 2有點長的證明
•
用歸納法•
首先:•
∑ 1•
∑•
假設 0 and 1 .•
n=2時, 2 2 2 log 2•
假設1 時, log22
有點長的證明
•
cm ∑•
cm ∑ log•
cm log•
•
log•
logQuick 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 case). 所以為•
總共需要多少pass呢?•
每次數量減少一半•
所以需要 log passes.•
總共所需時間為 log•
需要額外的空間來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 1 ∑ 2 ∑
• 2
• 2. 每次拿一個item出來, 花 log n 1 log
• 總共n‐1次, 共 log
• 只需要少數額外空間.
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 log log
Merge sort log log
Quick sort log
Sorting on several keys
•
假設K有很多個sub‐key•
, , … ,•
則 iff•
, , , 1 , , for some , or•
, , , 1•
則我們可以有以下的sorting 方法.•
先依照most significant key sort, 然後依序往least significant key sort過去: Most Significant Digit first (MSD) sorting•
先依照least significant key sort, 然後依序往most significant key sort過去: Least Significant Digit first (LSD) sorting32
Most significant key Least significant key
Sorting on several keys
•
哪一種比較好?•
如果使用stable sorting algorithm, 則LSD sort比較單純•
sort成”一桶一桶”以後不需要分開sort•
用黑板舉例吧~~ (投影片做到發瘋了)Radix Sort
•
方法: 每次用某種方法把items分為r堆. 然後再concatenate起 來.•
怎麼分為r堆?•
舉例: 每次使用某一位數的數字分堆.•
第一次依照個位數分為十堆, 然後再放在一起.•
第二次依照十位數分為十堆, 然後再放在一起.•
…•
直到完成(共d個pass).•
最後放在一起的items即為sort好的list.•
•
用黑板舉例. 34