演算法複雜度分為時間複雜度和空間複雜度。
其作用:
時間複雜度是指執行演算法所需要的計算工作量;
而空間複雜度是指執行這個演算法所需要的記憶體空間。
(演算法的複雜性體現在執行該演算法時的計算機所需資源的多少上,計算機資源最重要的是時間和空間(即暫存器)資源,因此複雜度分為時間和空間複雜度)。
簡單來說,時間複雜度指的是語句執行次數,空間複雜度指的是演算法所佔的儲存空間
時間複雜度
計算時間複雜度的方法:
用常數1代替執行時間中的所有加法常數
修改後的執行次數函式中,只保留最高端項
去除最高端項的係數
按數量級遞增排列,常見的時間複雜度有:
常數階o(1)
,對數階o(log2n)
,線性階o(n)
,
線性對數階o(nlog2n)
,平方階o(n^2)
,立方階o(n^3)
,…,
k次方階o(n^k)
,指數階o(2^n)
。
隨著問題規模n的不斷增大,上述時間複雜度不斷增大,演算法的執行效率越低。
舉個栗子:
sum = n*(n+1)/2; //時間複雜度o(1)
for(int i = 0; i < n; i++)
//時間複雜度o(n)
for(int i = 0; i < n; i++)
}
//時間複雜度o(n^2)
for(int i = 0; i < n; i++)
}
//執行次數為(1+n)*n/2
//時間複雜度o(n^2)
int i = 1, n = 100;
while(i < n)
//設執行次數為x. 2^x = n 即x = log2n
//時間複雜度o(log2n)
最壞時間複雜度和平均時間複雜度
最壞情況下的時間複雜度稱最壞時間複雜度。一般不特別說明,討論的時間複雜度均是最壞情況下的時間複雜度。
這樣做的原因是:最壞情況下的時間複雜度是演算法在任何輸入例項上執行時間的上界,這就保證了演算法的執行時間不會比任何更長。
平均時間複雜度是指所有可能的輸入例項均以等概率出現的情況下,演算法的期望執行時間。設每種情況的出現的概率為pi,平均時間複雜度則為sum(pi*f(n))
常用排序演算法的時間複雜度
最差時間分析 平均時間複雜度 穩定度 空間複雜度
氣泡排序 o(n2) o(n2) 穩定 o(1)
快速排序 o(n2) o(n*log2n) 不穩定 o(log2n)~o(n)
選擇排序 o(n2) o(n2) 穩定 o(1)
二叉樹排序 o(n2) o(n*log2n) 不穩定 o(n)
插入排序 o(n2) o(n2) 穩定 o(1)
堆排序 o(n*log2n) o(n*log2n) 不穩定 o(1)
希爾排序 o o 不穩定 o(1)
空間複雜度
空間複雜度(space complexity)是對乙個演算法在執行過程中臨時占用儲存空間大小的量度,記做s(n)=o(f(n))。
對於乙個演算法來說,空間複雜度和時間複雜度往往是相互影響的。當追求乙個較好的時間複雜度時,可能會使空間複雜度的效能變差,即可能導致占用較多的儲存空間;反之,當追求乙個較好的空間複雜度時,可能會使時間複雜度的效能變差,即可能導致占用較長的執行時間。
有時我們可以用空間來換取時間以達到目的
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...