演算法的計算成本涵蓋許多方面,為確定計算成本的度量標準,我們不妨從計算速度這一重要因素入手。
但是這一問題並不是容易直接上手回答,原因在於,運算時間是由許多因素綜合作用而決定的。即使是同一演算法,對於不同的輸入所需的運算時間並不相同。問題規模往往是決定計算成本的主要因素。一般的,問題規模越相近,相應的計算成本也越相近;而隨著問題的擴大,計算成本通常也呈上公升趨勢。
所以,執行時間這一變化趨勢可以表示為輸入規模的乙個函式,稱作該演算法的時間複雜度(time complexity)。具體的,特定演算法處理規模為n的問題所需時間可記為t(n)。從嚴格上來說,在規模為n的所有輸入中選擇實行時間最長者為t(n),並以t(n)度量該演算法的時間複雜度。
對於相同輸入規模n的輸入,通過比較t(n),便可以評價不同演算法的計算效率高低。然而,藉此還不足以就其效能優劣作出具體性的評判,比如對於某些問題,一些演算法更適用於小規模的輸入,有些則相反。
在實際問題處理中,我們常常可以忽略較小規模輸入的效率差異,因為其絕對時間開銷較小;但是對於較大規模的輸入,效率的些許差異將會造成時間開銷的極大差異。對於注重時間複雜度的總體變化趨勢和增長速度的策略和方法,稱為漸近分析(asymptotic analysis)。
對足夠大的的輸入規模n進行評價度量,我們引入o記號。
處於保守估計,我們關注t(n)的漸進上界。具體的,對於任何n>>2都有:t(n)<=c*f(n) ;由這一定義可認為在n足夠大之後,f(n)給出了t(n)增長速度的乙個漸進上界。此時記之為:
t(n)=o(f(n))
由這一定義可匯出o記號的性質:
1.對任意一常數c>0,有o(f(n)) = o(c*f(n))
2.對任意一常數a>b, 有o(n^a+n^b) = o(n^a)
前一性質意味在o記號的意義下,函式各項正的常係數可以忽略並等同於1,;後一性質則意味著多項式中低次項均可以忽略,只需保留最高次項。可以看出,o記號的這些性質的確體現了對函式總體漸進增長趨勢的關注和刻畫。
但是同一演算法在不同的硬體平台上所需的計算時間均不相同,因此有必要採用一種超脫於具體硬體平台和軟體環境的某一客觀標準,來度量時間複雜度,進而評價不同演算法的效率差異。 所以我們引入基本操作這一概念。
在圖靈機等計算模型中,指令語句均可分解為執行若干次基本操作,比如 算術運算,比較,分支,子程式呼叫與返回等;在大多數計算環境中,基本操作均可以在常數時間內完成。
於是我們可以將t(n)定義為演算法執行基本操作的總次數。這樣,只需統計出該演算法所執行的基本運算元目便可以確定t(n)的上界。
下面我們通過乙個具體的例子來看t(n)的計算方法和性質。
以此氣泡排序演算法為例,演算法為內外兩層迴圈,當輸入規模為n個元素陣列時,內層迴圈依次比較相鄰兩元素大小,每一次需要進行n-1次比較,至多需要交換n-1次。故內層迴圈每輪至多進行2(n-1)次基本操作。而外層迴圈最多執行(n-1)次迴圈(此處涉及演算法正確性分析,此處不再詳細說明),綜上所述,該演算法最多執行2(n-1)^2次基本操作,則有
t(n) = o(2(n-1)^2)
t(n) = o(2n^2-4n+2) = o(2n^2) = o(n^2)
最後,在o記號表示的時間複雜度估計並不排斥更好甚至最好的情況,對於這些情況,分別有大ω記號(對演算法執行效率最樂觀的估計)和大θ記號(對演算法執行效率的準確估計)。相比較而言,「最壞情況複雜度「是人們關注最多且使用最多的,在一些特殊場合下甚至是
唯一的指標。所以並不在此介紹,有興趣的讀者可以自行搜尋相關性質。
01 時間複雜度 空間複雜度
1 時間頻度 乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t n n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。2 時間複雜度 若有某個輔助函式f n 使得當n趨近於無窮大時,t n f n 的極限值為不等於零的常數,則稱f n 是t n 的同數量級函式。記作t n f ...
0 時間複雜度
快 時間複雜度 省 空間複雜度 def get sum n result 0 for i in range 1,n 1 result i return result假設每行 對應的cpu執行時間一樣,為乙個時間單位unit time 可以看到該函式第2 5行執行1次,第3 4行執行n次 總共執行時間...
演算法效率 1 時間複雜度 2 空間複雜度。
3 空間複雜度 1.演算法效率 演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率。時間效率被稱為時間複雜度,而空間效率被稱作空間複雜度。時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小。所以對空間複雜度很是...