數據結構與算法分析的一點隨記2.0

一.算法分析的必要性及其採用的分析方法
必要性:如果我們不能再寫程序之前就能考察其是否高效,很大概率上會寫出低效的程序,極大地浪費了人力資源。
算法分析主要分析程序所佔空間和其運行時間,但隨着硬件行業的發展,空間資源相對充足,時間成了考察的重點。
分析其時間我們很容易想到考察具體程序的運行時間,但對於一個具體的算法我們 不能片面地通過運行時間來考察它是否高效,原因如下:
1.一個高明的程序員可能會通過剪枝等方法,讓它看起來不那麼低效;
2.電腦的性能的不同,同樣的程序如果在一臺性能很好的電腦上跑可能運行時間會在可接受的範圍之內,但這並不能說明這是一個高效的算法;
3.程序運行有最好結果,最壞結果。在運行時有可能得到的是最好結果,掩蓋了程序的低效。
那怎麼辦呢?答案是漸進分析法
漸進分析法:估算出當問題規模變大時,一種算法及實現它的程序的效率和開銷。
基本操作:一個基本操作必須滿足“完成該操作所需要的時間與操作數的具體取值無關”的特點。(例如兩個數相加或者比較兩個數的大小)
基本操作數
我們需要一個標準量度來表達運行時間的長短,由於電腦性能差異,編譯器不同等原因,漸進分析法採用了另一種尺度來代替運行時間——基本操作數
這樣一個程序運行所需要的運行時間則由其運行的基本操作數代替。
判斷算法性能的一個基本考慮是處理一定規模的輸入時所需要執行的基本操作數
舉個簡單的栗子:

sum=0;
for(int i=1;i<=n;i++)
    for(j=1;j<=n;j++)
        sum++;

在上面的程序中問題的規模是n*n,基本操作值是sum加1,所以其基本操作數是n*n,我們用基本操作數替代了運行時間。
漸進分析中算法的增長率:指當輸入的值增加時,算法代價的增長速率。
最佳,最差,平均情況
對於計算N的階乘的問題,只有一個輸入,即給定的“大小”(也就是說,對於不同的N,都對應一個唯一的基本操作數)但現在考慮在一個數組中查找一個數,對於一個特定的N維數組,我們要查找的數即輸入的數不同,其對應的運行時間,即基本操作數就很可能不同,如果我們要查找的數就在數組開頭那麼基本操作數就爲1,這顯然是最好情況,當我們要查找的數在數組的尾部,基本操作數就爲N,這顯然是最壞情況。而對於平均情況,只有當我們知道輸入不同數字的概率分佈後,才能求出平均情況(這點增加了考察其的難度)
所以這三種情況中,一般考慮地最多的是最差情況(最佳情況過於樂觀,平均情況不好求得,最壞情況至少可以防止黑天鵝事件發生(抖個機靈))
上限:算法運行時間的上限,表示該算法可能有的最高增長率。(簡稱上限)
表示方法(大O表示法):O(f(n))
精確定義:對於非負函數T(n),如果存在兩個正常數c和no,對任意n>no,有T(n)

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