算法效率分析


希望大家還是在實踐當中感受效率,理解效率,寫出高質量的代碼和算法,僅僅作為參考,不要誤導大家。排版盡量舒服吧,盡力了。

一般而言分析算法效率的方式有兩種,即:時間效率和空間效率。時間效率也稱為時間復雜度;空間效率也稱為空間復雜度。在計算機技術發展的幾十年中,空間資源變得不是非常重要了,因此在一般的算法分析中,討論的主要是時間復雜度,當然空間復雜度的分析也是如此。

在算法分析中,我們不使用時間的標准單位(例如:秒,毫秒等)來衡量算法的快慢,而是使用基本操作的次數來衡量時間復雜度。並且,我們在分析時間復雜度的時候僅關注執行次數的增長次數及其常數倍。

對於大規模的輸入,增長次數是非常重要的,下面表中第一列給出輸入數據的規模,后面的每列是不同時間復雜度對應的執行次數。可以看出logn是最快的,n!是最慢的。

 有些時候時間復雜度不僅僅取決於輸入數據的規模,還取決於輸入數據的一些特定的細節(例如:快速排序算法的最快情況僅需要nlogn,而最壞情況下需要n²。這種差異就取決於原來的序列是隨機的還是較為有序的)因此,我們還需要最壞,平均,最優這三種時間復雜度來刻畫一個算法的實際情況。所以當一個算法的最優時間復雜度都不能滿足要求的時候,那么該算法就可以立即被拋棄。最壞時間復雜度刻畫的最壞的情況並不是經常出現的,因此在分析的時候,往往采用的是平均時間復雜度來刻畫一個實際問題。

 

 

 

 

 

 

 

 

 

算法效率衡量方法:

1、算法采用的策略和方案

2、編譯產生的代碼質量

3、問題的輸入規模

有三種符號表示的作為分析時間復雜度的方式,分別是O,Ω,θ。簡單來說,它們的含義是這樣的

O(n)表示增長次數小於等於n的算法;

Ω(n)表示增長次數大於等於n的算法;

θ(n)表示增長次數等於n的算法;

如果一個算法是由兩部分組成的,那么他的時間復雜度應該由下面的定理給出:

 

 該定理說明了一個算法整體效率是由具有較大增長次數那部分決定的(效率差的那部分)。

有時候分析算法的時間復雜度需要比較兩個函數的極限情況,根據高等數學的知識,我們知道有高階無窮小,同階無窮小,以及低階無窮小。它們對應如下的增長次數

 

 

 

 

 

 

當然,在實際情況下如果輸入規模較小的話,那么不同算法之間的時間復雜度幾乎對執行沒有什么影響,當n的規模大的時候必須認真考慮算法的時間復雜度。下表給出了基本的效率類型

 非遞歸算法的通用效率分析方案:

1、決定使用哪些量作為輸入的數據規模;

2、找出算法的基本操作(一般都是在最內層的循環中,並且這個操作每次都要被執行);

3、檢查基本操作的次數是否只依賴於輸入數據的規模,而與其他東西無關。(若與其他事物有關,那么則應分析出最壞,最優,平均這三種復雜度);

4、建立基本操作執行次數的求和表達式;

5、利用求和運算的公式和法則來建立一個操作次數的閉合公式,或者至少確定它的增長次數。

 

 

遞歸算法的數學分析,由於遞歸是直觀的,我們必須找出遞歸過程中的初始條件和遞推關系。根據初始條件和遞推關系求出通項公式。對通項公式分析可以得出算法執行的次數,當然和循環不同的是遞歸過程中會產生額外的空間開銷和時間開銷。這就是簡單帶來的壞處吧!遞歸算法的分析步驟如下:

  1. 決定使用哪些量作為輸入的數據規模;

  2. 找出算法的基本操作;

  3. 檢查基本操作的次數是否只依賴於輸入數據的規模,而與其他東西無關。(若與其他事物有關,那么則應分析出最壞,最優,平均這三種復雜度);

  4. 建立一個遞推關系式,並且求出初始條件,這樣就明確了基本操作執行的次數;

  5. 由遞推關系求出基本操作的關系式,或者至少確定它的增長次數;

 大多是遞歸算法的遞推公式是由類型與f(n)= f(x) + C;或者是f(n)= f(x)*C;這種類型的遞推公式它在等號右邊只會出現一個f(x),這種類型的大都可以用迭代的方式求出其通項公式。但是像斐波那契數列這種遞推公式,F(N) = F(N-1)+F(N-2)(這種遞推公式被歸類為常系數齊次二階線性遞推式)。這種形式的遞推公式可以看做是一個二階常系數線性差分方程來對待。通過求其特解和通解,然后求出全解。

 

這樣我們就得到了斐波那契數列的通項公式。使用遞歸求解斐波那契數列總是做了很多重復計算:F(N) = F(N-1)+F(N-2)因為算F(N-1)需要算F(N-2)。所以對於數值運算,通常最好不要使用遞歸。

算法的經驗分析

即使我們掌握了上面的這些分析技術,但是在實際中,某些算法還是無法分析的。數學方式並不總是有效的。經驗分析是對一些樣本輸入進行時間或者是操作次數的統計,做出他們的平均值,可以看做是平均效率。也可以使用語言本身提供的系統函數來計算程序執行的時間。

 

時間復雜度:   排序的時間復雜度可用算法執行中的數據比較次數與數據移動次數來衡量。后面一般都按平均情況進行估算。對於那些受對象關鍵字序列初始排列及對象個數影響較大的,需要按最好情況和最壞情況進行估算。

 

空間復雜度:排序過程中需要使用的輔助存儲空間。

快速排序時間復雜度

把排序算法想象成二叉樹結構

 

 一個數組的容量是N,第一層遞歸遍歷的次數是N,因為數組里每個數字都需要和key比較,那么接下來遍歷分出來的兩個區間,總的遍歷次數還會是近似是N,以此類推,直到分為最后一個,也就是說樹的高度是lgn,也就是遞歸次數,所以時間復雜度是N*lgN.

逆序和有序的時間復雜度為n^2屬於最差的情況,輔助空間為n*logn。平均復雜度和最好的情況都為n*logn。

 

直接插入1+2+........+n=n*(n+1)/2約等於n^2為平均復雜度,最好的情況為正序的時候直接掃描一遍就可以為n,最壞是完全逆序n^2,輔助空間為1.

冒泡排序  n-1 +n-2   + ,,,,,+ 1=n*(n-1)/2為平均復雜度,最好的時間復雜度為正序不發生交換比較就可以了n,最壞的情況是逆序時間復雜度為n^2,輔助空間為1.

直接選擇排序n-1+n-2+,,,,+1=(n-1)*n/2為平均復雜度,正序和逆序情況還有最好和最壞的時間復雜度都為n^2,輔助空間為1

堆排序是類似一顆完全二叉樹,時間復雜度=遞歸次數*每次遞歸遍歷次數=n*logn,最好最壞情況都是一顆完全二叉樹時間復雜度都為n*logn,注意是“空間復雜度”指占內存大小,堆排序每次只對一個元素操作,是就地排序,所用輔助空間O(1)。

希爾排序最好的情況時間復雜度為n^2,最壞的情況為n。輔助空間為1.對希爾排序的時間復雜度分析很困難,在特定情況下可以准確的估算排序碼的比較次數和元素移動的次數,但要想弄清楚排序碼比較次數和元素移動次數與增量選擇之間的依賴關系,並給出完整的數學分析,還沒有人能夠做到。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM