作者 | fcamel (飛啊!起舞的小駱駝) | 看板 | P_fcamel |
標題 | [Algo] Radix Sort Anaylysis |
時間 | Mon Nov 1 01:44:14 2004 |
之前寫過一篇"[Algo] Radix Sort for general floating type",
討論data為浮點數時, Radix Sort的實作方式和效率分析
這篇是針對任意type討論,
並依序加入一些"合理"的限制以方便討論
Background Description
Sort Lower Bound:
Sort的lower bound可以用comparing tree的概念去證明,
建立在compare & exchange的運算模型下, 最快只能到Omega(NlgN),
換句話說, 若想挑戰更低的極限, 必須跳出compare & exchange的模式
但無論如何, 基於每筆data一定要存取到的原則,
在Turing Machine架構下, Omega(N)是絕對的lower bound
Radix Sort [*1]:
把data建立出多個key, 依據最不重要的key到最重要的key來做sort,
運算是建立在hash上, 依據key存在有順序的陣列上,
再依順序取回來, 即可達到排序 (沒有compare, 也沒有exchange)
假設有N筆data, 對應的key是整數型態, 無限定range,
這是很常見也很容易產生的一種key的type
( one data <-> one key )
因為沒有限定range, 必須考慮如何產生多種key,
使得key的range在限定範圍, 才能用陣列存
先排除負數的考量:
a. 依據key的正負值把data分成兩堆, theta(N)
b. 各別對正數, 負數兩堆key做Radix Sort
c. 把排好的兩堆key串在一起就完成sort了, theta(N)
排除負數的前置動作沒有使complexity超出theta(N)
以下的討論著眼在key value為0 ~ 正無窮大整數內
設有 N 筆 data, 陣列的index range為 0 ~ K
a. 將key視為 K 進位的值, 依K^0, K^1, ..., K^D拆為key0, key1, ..., keyD [*2]
b. 依key0, key1, ..., keyD的順序做Radix Sort,
Complexity為 (N+K) * D
N, K都是可以決定的值, D的值依key的max value而有改變,
D = ceiling( log(max absolute value of key) ), log是以K為底數 [*3]
所以, 當max absolute value of key < K時,
效率為theta(N), 是個特例, 也是一般提到Bucket Sort時的情況
加上 N >= K的條件, 可以使comlexity更精確, 貼近一般的使用情況,
complexity = theta(N*D)
換句話說, 只有當D < logN時,
理論上Radix Sort才會比based on compare & exchange的sort快,
別忘了D的值也是log的結果, 取決於陣列的大小和key的max value
既然Radix Sort必須在特定條件下才能變快,
我覺得它並沒有很成功地跨越Omega(NlgN)的障礙, 感覺有點偷吃步
如果based on compare & exchange,
對sort的目標加上一些條件限制,
是否能得出一般化且跨越Omega(NlgN)的sort呢?
這樣的Algorithm, 是否能描述的出來呢? [*4]
PS
[1] Radix Sort Algorithm: (參考用的描述, 有條件限制的使用)
已知: 有n筆資料, 每個element有d個key, 這d個key的range在0~N-1之間
作法:
0. 準備一個一維陣列A, size是N, 假設實作方式用linked-list當陣列的type,
就是類似hash table的其中一種作法
1. 用第d個key, 把n筆資料都插到subscript為key(d)的地方,
也就是A[key(d)].addLast(elem)
2. for i = 0 ~ N-1,把element都取回來
3. 按順序把key從d-1 ~ 0重覆step 1, 2
analysis:
time complexity
insert :d * n
retreive:d * N
total :O( d * (n+N) )
這裡的n+N有點模糊, 依實作方式也可以真的達到d*(n+N), 但這不影響order,
取K = max(n, N), 說它是O(d * 2K)也無所謂
[2]把key拆成key0 ~ keyD的作法
keyM = key mod K # Radix Sort使用keyM
key = key / K
[3] ceiling(N)
ceiling(3.3) = 4
ceiling(3.0) = 3
ceiling(2.9) = 3
[4] 比方insertition Vs order"很正確"的data
insertion sort的complexity為Omega(N), O(N^2),
不知在限定條件下加上機率運算, 能否算出一個明確的complexity?
這可能得看條件要怎麼限定了
|