16
SORTING IN LINEAR TIME Michael Tsai 2012/5/22

Sorting in Linear Time

  • 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

Page 1: Sorting in Linear Time

SORTINGIN LINEAR TIMEMichael Tsai2012/5/22

Page 2: Sorting in Linear Time

2

Sorting Algorithm in Linear Time?

• 上回講過 , Comparison-based ( 比較元素然後交換其順序 ) sorting 的 complexity lower bound 為• 如何突破這個障礙 ? • 不要使用 comparison-based 的方法• 因此可達到• 需要利用額外的假設• 通常是”以空間換取時間”

Page 3: Sorting in Linear Time

例子 : 電話排序問題• 電話排序假設全部電話號碼有 s 個種可能 ( 所有排列組合 )• 我們有 n 組電話要排• 則使用超大表格排序法需要 O(s) 的時間 ( 空間換取時間 )

Index20000000空20000002……89999999

Array有空有……有

Input: {20000002, 89999999, 20000000, …}

共 s 個

Page 4: Sorting in Linear Time

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

5

Counting SortInput array

Counting: 算每個數字出現了幾次 “Cumulative Mass Function”算小於或等於 index 的數字出現了幾次

假設 : 知道可能出現的所有 input 種類個數 K ( 而且 )

Page 6: Sorting in Linear Time

6

Counting Sort

比 3 小或相等的有 7個

Page 7: Sorting in Linear Time

7

Counting Sort

比 0 小或相等的有 2個

Page 8: Sorting in Linear Time

8

Counting Sort注意 Counting Sort 為 stable sort. 因為是從最後面依序放入 output array, 因此同樣大小的元素會依原本input array 中順序放入 .

Page 9: Sorting in Linear Time

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

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

11

Radix Sort

329457657839436720355

720355436457657329839

720329436839355457657

329355436457657720839

以個位數排序 以十位數排序

注意 :十進位一樣的部分會照前一回合的順序( 也就是個位數的順序 !)

因此用來排序的演算法必須是 stable!

以百位數排序

先依照 most significant digit sort, 然後依序往 least significant key sort 過去 : Most Significant Digit first (MSD) sorting

假設 : 有”多個key”

Page 12: Sorting in Linear Time

12

Radix Sort如果先依照 least significant key sort, 然後依序往 most significant key sort 過去 : Least Significant Digit first (LSD) sorting?

329457657839436720355

329355457436657720839

以百位數排序329720436839355457657

以十位數排序

如果直接使用接下來的十位數排序會亂掉 !

329355436457657720839

正確的做法必須切分成小的 subset再去排序 ! ( 因此LSD 比較麻煩 )

Page 13: Sorting in Linear Time

13

Radix Sort

329457657839436720355

720355436457657329839

720329436839355457657

329355436457657720839

以個位數排序 以十位數排序 以百位數排序

假設使用Counting Sort在每一回合做排序

𝑂 (𝑛) 𝑂 (𝑛) 𝑂 (𝑛)

𝑂 (𝑑𝑛)d 個 , d= 位數

Page 14: Sorting in Linear Time

14

Bucket Sort 假設 : input 是從 uniform distribution 取出來的先依照小數點後第一位分到不同的” bucket”

同樣 bucket 的再使用簡單的 insertion sort 做排序

最後再把各 bucket 內的元素依序列出即可

Page 15: Sorting in Linear Time

15

Bucket Sort• 假設 : input 是從 uniform distribution 取出來的• 因此分到各個 bucket 的數量會差不多 .

• 大略計算一下所需的時間 :

總時間

走過每個 bucket 的時間

每個 bucket 內 insertion sort 所需時間( 證明過程請見 Cormen p202-203)

Page 16: Sorting in Linear Time

16

Today’s Reading Assignment• Cormen 8.2, 8.3, 8.4