筆記-算法-復雜度
筆記-算法-復雜度
1. 算法復雜度簡介
算法復雜度用於衡量某一算法在時間和存儲空間上的開銷;一般情況下主要討論時間開銷;
2. 時間復雜度
2.1. 時間復雜度定義
在分析算法時間開銷時,語句的執行次數t(n)*單條語句執行時間=總時間;
單條語句執行時間一般設定為一個常數,而T(n)是關於問題規模n的函數,分析算法復雜度就是分析T(n)隨n的變化情況並確定T(n)的數量級(在大規模事件中,數量級比具體數字重要得多)。
常用算法時間復雜度表示方法:T(n)=O(f(n))
這種方法稱之為大O記法。
2.2. 推導方法
1、用常數1取代運行時間中的所有加法常數。
2、在修改後的運行次數函數中,只保留最高階項。
3、如果最高階項存在且不是1,則去除與這個項目相乘的常數。得到的結果就是大O階。
2.3. 常見算法時間復雜度
時間復雜度包括最壞復雜度和平均復雜度,一般情況下不特別說明,討論的時間復雜度是最壞情況下的時間復雜度。
按數量級遞增排列,常見的時間復雜度有:
常數階 |
對數階 |
線性階 |
線性對數階 |
平方階 |
立方階 |
…… |
K次方階 |
指數階 |
O(1) |
O(log2 n ) |
O(n) |
O(nlog2 n) |
O(n2 ) |
O(n3 ) |
|
O(nk ) |
O(2n ) |
復雜度低 ---->---->---->----> 復雜度高
隨著問題規模n的不斷增大,上述時間復雜度不斷增大,算法的執行效率越低。
下面的圖片更形象說明了不同階數算法的執行效率。
3. 空間復雜度
與時間復雜度類似,空間復雜度是指算法在計算機內執行時所需存儲空間的度量。記作:
S(n)=O(f(n))
算法的空間復雜度並不是計算實際占用的空間,而是計算整個算法的輔助空間單元的個數,與問題的規模沒有關系。算法的空間復雜度S(n)定義為該算法所耗費空間的數量級。
若算法執行時所需要的輔助空間相對於輸入數據量n而言是一個常數,則稱這個算法的輔助空間為O(1);
遞歸算法的空間復雜度:遞歸深度N*每次遞歸所要的輔助空間,如果每次遞歸所需的輔助空間是常數,則遞歸的空間復雜度是 O(N).
空間復雜度的分析方法:
一個算法的空間復雜度S(n)定義為該算法所耗費的存儲空間,它也是問題規模n的函數。空間復雜度是對一個算法在運行過程中臨時占用存儲空間大小的量度。
一個算法在計算機存儲器上所占用的存儲空間,包括存儲算法本身所占用的存儲空間,算法的輸入輸出數據所占用的存儲空間和算法在運行過程中臨時占用的存儲空間這三個方面。
一個算法的空間復雜度只考慮在運行過程中為局部變量分配的存儲空間的大小,它包括為參數表中形參變量分配的存儲空間和為在函數體中定義的局部變量分配的存儲空間兩個部分。
算法的空間復雜度一般也以數量級的形式給出。如當一個算法的空間復雜度為一個常量,即不隨被處理數據量n的大小而改變時,可表示為O(1);當一個算法的空間復雜度與以2為底的n的對數成正比時,可表示為O(log2n);當一個算法的空間復雜度與n成線性比例關系時,可表示為O(n)。若形參為數組,則只需要為它分配一個存儲由實參傳送來的一個地址指針的空間,即一個機器字長空間;若形參為引用方式,則也只需要為其分配存儲一個地址的空間,用它來存儲對應實參變量的地址,以便由系統自動引用實參變量。
空間復雜度補充
一個程序的空間復雜度是指運行完一個程序所需內存的大小。利用程序的空間復雜度,可以對程序的運行所需要的內存多少有個預先估計。一個程序執行時除了需要存儲空間和存儲本身所使用的指令、常數、變量和輸入數據外,還需要一些對數據進行操作的工作單元和存儲一些為現實計算所需信息的輔助空間。程序執行時所需存儲空間包括以下兩部分。
(1)固定部分。這部分空間的大小與輸入/輸出的數據的個數多少、數值無關。主要包括指令空間(即代碼空間)、數據空間(常量、簡單變量)等所占的空間。這部分屬於靜態空間。
(2)可變空間,這部分空間的主要包括動態分配的空間,以及遞歸棧所需的空間等。這部分的空間大小與算法有關。
一個算法所需的存儲空間用f(n)表示。S(n)=O(f(n)) 其中n為問題的規模,S(n)表示空間復雜度。
4. 附-時間與空間復雜度比較
對於一個算法,其時間復雜度和空間復雜度往往是相互影響的。當追求一個較好的時間復雜度時,可能會使空間復雜度的性能變差,即可能導致占用較多的存儲空間;反之,當追求一個較好的空間復雜度時,可能會使時間復雜度的性能變差,即可能導致占用較長的運行時間。
另外,算法的所有性能之間都存在著或多或少的相互影響。因此,當設計一個算法(特別是大型算法)時,要綜合考慮算法的各項性能,算法的使用頻率,算法處理的數據量的大小,算法描述語言的特性,算法運行的機器系統環境等各方面因素,才能夠設計出比較好的算法。算法的時間復雜度和空間復雜度合稱為算法的復雜度。
常用的算法的時間復雜度和空間復雜度:
排序法 |
平均時間 |
最差情形 |
穩定度 |
額外空間 |
備註 |
冒泡 |
O(n2 ) |
O(n2 ) |
穩定 |
O(1) |
n較小時較好 |
交換 |
O(n2 ) |
O(n2 ) |
不穩定 |
O(1) |
n較小時較好 |
選擇 |
O(n2 ) |
O(n2 ) |
不穩定 |
O(1) |
n較小時較好 |
插入 |
O(n2 ) |
O(n2 ) |
穩定 |
O(1) |
大部分已排序時較好 |
基數 |
O(logR B) |
O(logR B) |
穩定 |
O(n) |
B是真數(0-9), R是基數(個十百) |
Shell |
O(nlogn) |
O(ns ) 1<s<2 |
不穩定 |
O(1) |
s是所選分組 |
快速 |
O(nlogn) |
O(n2 ) |
不穩定 |
O(nlogn) |
n較大時較好 |
歸並 |
O(nlogn) |
O(nlogn) |
穩定 |
O(1) |
n較大時較好 |
堆 |
O(nlogn) |
O(nlogn) |
不穩定 |
O(1) |
n較大時較好
|
穩定的排序:保證,排序關鍵字相同的情況下,對象的相對位置不變
筆記-算法-復雜度