1. 程式人生 > >演算法的時間複雜度和空間負責度、最壞情況和平均情況

演算法的時間複雜度和空間負責度、最壞情況和平均情況

解決問題的效率與空間利用率,時間利用率,演算法效率都有關係。

演算法(Algorithm)是什麼呢?

  • 輸入——接受一些輸入或無輸入
  • 輸出——產生輸出
  • 確定性——每條指令必須明確無歧義
  • 能行性——每條指令都可以執行,一個有限的指令集
  • 有窮性——執行一定步驟後終止

此外,衡量一個演算法的效能主要有四個指標:正確性,簡明性,健壯性,效率。

一個用高階語言編寫的程式在計算機上執行時所消耗的時間取決於下列因素:

(1). 演算法採用的策略、方法;

(2). 編譯產生的程式碼質量;

(3). 問題的輸入規模;

4). 機器執行指令的速度。

     一個演算法是由控制結構(順序、分支和迴圈3種)和原操作(指固有資料型別的操作)構成的,則演算法時間取決於兩者的綜合效果。為了便於比較同一個問題的不同演算法,通常的做法是,從演算法中選取一種對於所研究的問題(或演算法型別)來說是基本操作的原操作,以該基本操作的重複執行的次數作為演算法的時間量度。

時間複雜度T(n):耗費時間的長度

漸進時間複雜度定義:設f(n)和g(n)是定義在正整數上的正函式,如果存在兩個證常數c和n0使得c>=n0時,有f(n)<=cg(n),則記作f(n)=O(g(n))。漸進時間複雜度簡稱為時間複雜度,大O幾號用來表達一個演算法執行時間的上界。當我們說一個演算法具有O(g(n))的執行時間時,是指該演算法在計算機上的執行時間不會超過g(n)的某個常數倍。

推導大O階:

  • l  用常數1取代執行時間中的所有加法常數
  • l  在修改後的執行次數函式中,只保留最高階項。
  • l  如果最高階項存在不是1的常數,則去掉這個常數。

得到的結果就是大O階。

常見的有常數階O(1),線性階O(n),對數階O(logn),平方階O(n2

),而指數階O(2n)和階乘階O(n!)都是不切實際的。

常見的時間複雜度排序如下:

O(1)< O(logn)<O(n)<O(nlogn)<O(n2)<O(n3)<…<O(2n)<O(n!)

最壞情況執行時間是一種保障,就是執行時間不會再壞了,通常除非特別指定,我們提到的執行時間都是最壞情況時間複雜度。而平均執行時間是所有情況中最有意義的,它是期望的執行時間。

空間複雜度:佔用儲存單元的長度。

空間複雜度包含兩個部分:

l  固定部分:與處理資料的大小和個數無關,或說與問題的例項特徵無關,主要包括程式程式碼、常量、簡單變數、定長結構變數。

l  可變部分:與演算法執行處理的資料大小和規模有關,包括資料元素所佔空間,以及演算法執行所需的額外空間。

若演算法執行時所需的輔助空間相對於輸入變數而言是個常數,則稱此演算法為原地工作,空間複雜度為O(1)。

常用排序演算法的時間複雜度如下:

複雜度分析:

  • T1(n)+T2(n)=max{O1(),O2() }
  • T1(n)*T2(n)=O(f1(n)*f2(n))
  • T(n)為關於n的k階多項式,那麼T(n)=O(nk)
  • For迴圈複雜度等於迴圈次數乘以迴圈體的複雜度
  • If-else:兩個分支中最大的

降低演算法複雜度:分而治之