Upload
noreen
View
56
Download
3
Embed Size (px)
DESCRIPTION
Sorting in Linear Time. Michael Tsai 2012/5/22. Sorting Algorithm in Linear Time?. 上回講過 , Comparison-based ( 比較元素然後交換其順序 ) sorting 的 complexity lower bound 為 如何突破 這個障礙 ? 不要 使用 comparison-based 的方法 因此可 達到 需要 利用 額外的假設 通常 是 ” 以空間換取時間 ”. 例子 : 電話排序 問題. 電話排序假設 全部電話號碼有 s 個 種 可能 ( 所有排列組合 ) - PowerPoint PPT Presentation
Citation preview
SORTINGIN LINEAR TIMEMichael Tsai2012/5/22
2
Sorting Algorithm in Linear Time?
• 上回講過 , Comparison-based ( 比較元素然後交換其順序 ) sorting 的 complexity lower bound 為• 如何突破這個障礙 ? • 不要使用 comparison-based 的方法• 因此可達到• 需要利用額外的假設• 通常是”以空間換取時間”
例子 : 電話排序問題• 電話排序假設全部電話號碼有 s 個種可能 ( 所有排列組合 )• 我們有 n 組電話要排• 則使用超大表格排序法需要 O(s) 的時間 ( 空間換取時間 )
Index20000000空20000002……89999999
Array有空有……有
Input: {20000002, 89999999, 20000000, …}
共 s 個
4
例子 : 電話排序問題• 如果使用 comparison-based sorting 平均需要• 假設超大表格排序法所需時間為• 假設 comparison-based 排序法所需時間為• break even point 為 s= 10 n log n • 假設以台北市電話號碼為例 , • , n<• break even point 大約為 n=k• 當 n 大於此數則 non-comparison sorting 比較快
5
Counting SortInput array
Counting: 算每個數字出現了幾次 “Cumulative Mass Function”算小於或等於 index 的數字出現了幾次
假設 : 知道可能出現的所有 input 種類個數 K ( 而且 )
6
Counting Sort
比 3 小或相等的有 7個
7
Counting Sort
比 0 小或相等的有 2個
8
Counting Sort注意 Counting Sort 為 stable sort. 因為是從最後面依序放入 output array, 因此同樣大小的元素會依原本input array 中順序放入 .
9
Counting Sortvoid CountingSort (int A[], int n, int B[], int K) {
int C[K], i, j,;for (i=0;i<K;i++)C[i]=0for (j=0;j<n;j++)C[A[j]]=C[A[j]]+1;for (i=1;i<K;i++)C[i]=C[i]+C[i-1];for (j=n-1;j>=0;j--) {B[C[A[j]]]=A[j];C[A[j]]--;}
}
A: input arrayn: input 總個數B: output arrayK: 可能出現的 input element總數
Counting: 數每種 element 共幾個“CMF”: 數比每種 element 小或相等的共幾個從 input array 最後一個開始依序放入 output array
𝑂 (𝐾 )
𝑂 (𝐾 )
𝑂 (𝑛)
𝑂 (𝑛)
𝑂 (𝑛+𝐾 )=𝑂(𝑛)
10
Sorting on several keys• 假設 K 有很多個 sub-key
• 則 iff• for some , or
• 則我們可以有以下的 sorting 方法 .• Most Significant Digit first (MSD) sorting• 先依照 most significant key sort, 然後依序往 least significant key sort過去
• Least Significant Digit first (LSD) sorting• 先依照 least significant key sort, 然後依序往 most significant key sort過去
Most significant key Least significant key
11
Radix Sort
329457657839436720355
720355436457657329839
720329436839355457657
329355436457657720839
以個位數排序 以十位數排序
注意 :十進位一樣的部分會照前一回合的順序( 也就是個位數的順序 !)
因此用來排序的演算法必須是 stable!
以百位數排序
先依照 most significant digit sort, 然後依序往 least significant key sort 過去 : Most Significant Digit first (MSD) sorting
假設 : 有”多個key”
12
Radix Sort如果先依照 least significant key sort, 然後依序往 most significant key sort 過去 : Least Significant Digit first (LSD) sorting?
329457657839436720355
329355457436657720839
以百位數排序329720436839355457657
以十位數排序
如果直接使用接下來的十位數排序會亂掉 !
329355436457657720839
正確的做法必須切分成小的 subset再去排序 ! ( 因此LSD 比較麻煩 )
13
Radix Sort
329457657839436720355
720355436457657329839
720329436839355457657
329355436457657720839
以個位數排序 以十位數排序 以百位數排序
假設使用Counting Sort在每一回合做排序
𝑂 (𝑛) 𝑂 (𝑛) 𝑂 (𝑛)
𝑂 (𝑑𝑛)d 個 , d= 位數
14
Bucket Sort 假設 : input 是從 uniform distribution 取出來的先依照小數點後第一位分到不同的” bucket”
同樣 bucket 的再使用簡單的 insertion sort 做排序
最後再把各 bucket 內的元素依序列出即可
15
Bucket Sort• 假設 : input 是從 uniform distribution 取出來的• 因此分到各個 bucket 的數量會差不多 .
• 大略計算一下所需的時間 :
總時間
走過每個 bucket 的時間
每個 bucket 內 insertion sort 所需時間( 證明過程請見 Cormen p202-203)
16
Today’s Reading Assignment• Cormen 8.2, 8.3, 8.4