數據結構學習筆記(緒論一)

緒論一

Programs= Algorithms+Data Structus

算法分析

一個好的算法:運算速度儘可能快,存儲空間儘可能少。
算法分析:
a. 正確性;
b. 成本(時間+空間) 時間成本—>基本操作次數

Turning Machine(圖靈機模型)
Random Access Machine(RAM)

Big-O-notation

複雜度分析:

a .迭代:技術求和;
b. 遞歸:遞歸跟蹤+遞歸方程,猜測+驗證。


遞歸和迭代的區別
遞歸:函數自己調用自己,相當於自頂向下,減而治之。

使用遞歸要注意的有兩點:
1)遞歸就是在過程或函數裏面調用自身;
2)在使用遞歸時,必須有一個明確的遞歸結束條件,稱爲遞歸出口。

遞歸分爲兩個階段:
1)遞推:把複雜的問題的求解推到比原問題簡單一些的問題的求解;
2)迴歸:當獲得最簡單的情況後,逐步返回,依次得到複雜的解。

遞歸可以極大簡化代碼,可讀性高,但由於遞歸需要系統堆棧,所以空間消耗要比非遞歸代碼要大很多,而且,如果遞歸深度太大,可能系統資源會不夠用。在求解斐波那契數列問題中就能充分體現,當求解超過45項就回變得非常慢。遞歸過程中多次重複構造已有的實例,造成資源的額外開銷。

迭代:利用已有的值不斷迭代出新值,相當於自下而上,分而治之。
迭代效率高,沒有額外開銷,但是不容易理解,不如遞歸好理解,編寫複雜問題困難。


不同級數的複雜度

T(n)=1+2+3+...+n=O(n2)
T2(n)=12+22+32+...+n2=O(n3)
T3(n)=13+23+33+...+n3=O(n4)
……
幾何級數:Ta(n)=a0+a1+a2+a3+...+an=O(an) 複雜度與末項同階。
收斂級數:T(n)=O(1)
調和級數:T(n)=1+1/2+1/3+1/4+...+1/n=O(logn)
對數級數:T(n)=log1+log2+log3+...+log(n)=log(n!)=O(nlogn)

對於兩層循環:

for(i=0;i<n;i++)
    for(j=0;j<i;j++){
        ......
    }

複雜度爲O(n2)
將i和j作爲橫縱座標,複雜度即可視爲爲矩形面積。(當i或者j的上限變化時,複雜度雖然可視爲爲三角形面積,但是依然是O(n2) )。

時間概念:
1105sec
113109sec
1010sec
1501081021sec

例如 :全國人口普查並排序,人口總數 n109 ,在不同硬件和軟件條件下估算比較計算時間。

軟硬件 普通PC機 頻率1GHz 運算速度 109flops 天河一號 1PHz 1015flops
Bubblesort (109)2=1018 109sec30 103sec20
Mergesort 109log(109)=30109 30sec 0.03ms

上表可以看出算法的不同,在處理大型問題的時候的差距明顯。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章