Sorting in Linear Time

Post on 21-Mar-2016

70 views 1 download

description

Sorting in Linear Time. Michael Tsai 2013/5/21. Sorting Algorithm in Linear Time?. 上回講過 , Comparison-based ( 比較元素然後交換其順序 ) sorting 的 complexity lower bound 為 如何突破 這個障礙 ? 不要 使用 comparison-based 的方法 因此可 達到 需要 利用 額外的假設 通常 是 ” 以空間換取時間 ”. 例子 : 電話排序 問題. 電話排序假設全部電話號碼有 s 個 種 可能 ( 所有排列組合 ) - PowerPoint PPT Presentation

Transcript of Sorting in Linear Time

SORTINGIN LINEAR TIMEMichael Tsai2013/5/21

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!

以百位數排序

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

假設 : 有”多個key”

12

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

329457657839436720355

329355457436657720839

以百位數排序329720436839355457657

以十位數排序

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

329355436457657720839

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

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