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