前往
大廳
主題

算法分析

奇異 | 2020-12-10 22:10:24 | 巴幣 0 | 人氣 119

Insertion Sort(插入排序)

array的排序方式
假設arry[8,2,4,9,3,6]
j以2為開始

第一步找到合適插入位置
移動2
為[2,8,4,9,3,6]

移動4
[2,4,8,9,3,6]

移動9但發現已比8大
所以不動

移動3
[2,3,4,8,9,6]

移動6
[2,3,4,6,8,9]

算法分析
A.Running time
(1)資料狀況
例:是否有經過排序
如果已經是排序過狀況
例如8,9
代表時間花費會很少

從大到小(逆序)
時間會花費最多因為需從頭比較

(2)資料規模
例子只需處理6個元素
但如果處理六十億?
解決方式:參數化

(3)所需計算時間上限
例:程式運行時間
用戶承諾

B.kind of analys
最壞情況
T(n)輸入規模為n時最長的運行時間
平均時間
T(n)輸入規模為n時所有可能下的期望時間
期望值=所有輸入時間總和求加權平均

C.插入排序最壞情況?
(1)計算機能力
64 bit V.S. 32 bit
相對速度
絕對速度

D. BIG IDEA(大局觀)
漸近分析
(1)忽略依賴機器的常量
(2)不關心運行時間但關注運行時間的增長

使用漸近符號
θ
例:n³-3n²+2=θ(n³)
你要理解當n無窮大時
θ(n²)的算法運行時間會比θ(n³)算法少

E.回到插入排序
T(n)=Σθ(j)    n j=2(因第一個不用比較)
可以簡化成θ(n²)      算術級數:1+2+3+4+....

如何更快?
Merge Sort(合併排序)

沿用上例將資料分成
[1...n/2]和[n/2-1....n]
再合併排序

關鍵在Merge
[2,7,13,20]
[1,9,11,12]

比較兩數列最小值
得1再看2,9
得2再看7,9
得7再看13,9
[1,2,7...]

運行時間T(n)=θ(n)  簡稱線性時間

分析
-----------------------
T(n)           |    A[1..n]
θ(1)           |    n=1 ,完成
2T(n/2)    |   [1...n/2]和[n/2-1....n]
θ(n)           |    合併

T(n)=
if n=1,θ(1)  (通常省略)
if n>1,2T(n/2) +θ(n)

遞迴解法
T(n)=2T(n/2) +cn (c>0) cn取代θ(n)
T(n)=       cn
       T(n/2)    T(n/2)

=                   cn
         cn/2              cn/2
T(n/4)  T(n/4) T(n/4)  T(n/4)

逐漸遞迴得到二叉樹
直到最底層
θ(1)

問這個二叉樹多高?
log n 指的是log(2)n

問這個二叉樹節點數是多少?
n

第一層花多少時間?cn
第二層花多少時間?cn
.
.
.
.
最後一層花多少時間?θ(n)
T(n)=cn*log n +θ(n)  (常數項可以捨去)
=θ(nlog n)

θ(nlog n)運行時間又比θ(n²) 少

參考補充:
漸進符號
插入排序

創作回應

更多創作