緒論一
Programs= Algorithms+Data Structus
算法分析
一個好的算法:運算速度儘可能快,存儲空間儘可能少。
算法分析:
a. 正確性;
b. 成本(時間+空間) 時間成本—>基本操作次數
Turning Machine(圖靈機模型)
Random Access Machine(RAM)
Big-O-notation
複雜度分析:
a .迭代:技術求和;
b. 遞歸:遞歸跟蹤+遞歸方程,猜測+驗證。
遞歸和迭代的區別
遞歸:函數自己調用自己,相當於自頂向下,減而治之。
使用遞歸要注意的有兩點:
1)遞歸就是在過程或函數裏面調用自身;
2)在使用遞歸時,必須有一個明確的遞歸結束條件,稱爲遞歸出口。遞歸分爲兩個階段:
1)遞推:把複雜的問題的求解推到比原問題簡單一些的問題的求解;
2)迴歸:當獲得最簡單的情況後,逐步返回,依次得到複雜的解。
遞歸可以極大簡化代碼,可讀性高,但由於遞歸需要系統堆棧,所以空間消耗要比非遞歸代碼要大很多,而且,如果遞歸深度太大,可能系統資源會不夠用。在求解斐波那契數列問題中就能充分體現,當求解超過45項就回變得非常慢。遞歸過程中多次重複構造已有的實例,造成資源的額外開銷。
迭代:利用已有的值不斷迭代出新值,相當於自下而上,分而治之。
迭代效率高,沒有額外開銷,但是不容易理解,不如遞歸好理解,編寫複雜問題困難。
不同級數的複雜度
……
幾何級數:
收斂級數:
調和級數:
對數級數:
對於兩層循環:
for(i=0;i<n;i++)
for(j=0;j<i;j++){
......
}
複雜度爲
將i和j作爲橫縱座標,複雜度即可視爲爲矩形面積。(當i或者j的上限變化時,複雜度雖然可視爲爲三角形面積,但是依然是
時間概念:
例如 :全國人口普查並排序,人口總數
軟硬件 | 普通PC機 頻率1GHz 運算速度 |
天河一號 1PHz |
---|---|---|
Bubblesort |
||
Mergesort |
上表可以看出算法的不同,在處理大型問題的時候的差距明顯。