時間複雜度和空間複雜度的簡單講解
乙個演算法的優劣主要從演算法的執行時間和所需要占用的儲存空間兩個方面衡量。
文章最後,舉例使用二分查詢和斐波那契的遞迴和迭代方法,分別說明時間和空間複雜度。
時間複雜度:
首先要說的是,時間複雜度的計算並不是計算程式具體執行的時間,而是演算法執行語句的次數。
當我們面前有多個演算法時,我們可以通過計算時間複雜度,判斷出哪乙個演算法在具體執行時花費時間最多和最少。
常見的時間複雜度有:
常數階o(1),
對數階o(log2 n),
線性階o(n),
線性對數階o(n log2 n),
平方階o(n^2),
立方階o(n^3)
k次方階o(n^k),
指數階o(2^n)。
隨著n的不斷增大,時間複雜度不斷增大,演算法花費時間越多。
計算方法
①選取相對增長最高的項
②最高項係數是都化為1
③若是常數的話用o(1)表示
如f(n)=2*n^3+2n+100則o(n)=n^3。
通常我們計算時間複雜度都是計算最壞情況
時間複雜度的計算:
(1)如果演算法的執行時間不隨著問題規模n的增加而增長,即使演算法中有上千條語句,其執行時間也不過是乙個較大的常數。此類演算法的時間複雜度是o(1)。
1int x=1;
2while (x <10)
3
該演算法執行次數是10,是乙個常數,用時間複雜度表示是o(1)。(2)當有若干個迴圈語句時,演算法的時間複雜度是由巢狀層數最多的迴圈語句中最內層語句的頻度f(n)決定的。
1for (i = 0; i < n; i++)
27 }
該演算法for迴圈,最外層迴圈每執行一次,內層迴圈都要執行n次,執行次數是根據n所決定的,時間複雜度是o(n^2)。(3)迴圈不僅與n有關,還與執行迴圈所滿足的判斷條件有關。
1int i=0;
2while (i < n && arr[i]!=1)
3
在此迴圈,如果arr[i]不等於1的話,時間複雜度是o(n)。如果arr[i]等於1的話,則迴圈不能執行,時間複雜度是0。空間複雜度
空間複雜度是對乙個演算法在執行過程中臨時占用儲存空間大小的量度。
計算方法:
①忽略常數,用o(1)表示
②遞迴演算法的空間複雜度=遞迴深度n*每次遞迴所要的輔助空間
③對於單執行緒來說,遞迴有執行時堆疊,求的是遞迴最深的那一次壓棧所耗費的空間的個數,因為遞迴最深的那一次所耗費的空間足以容納它所有遞迴過程。
如:
1inta;
2intb;3
intc;
4 printf("%d %d %d \n",a,b,c);
它的空間複雜度o(n)=o(1);
1int fun(int
n,)2
遞迴實現,呼叫fun函式,每次都建立1個變數k。呼叫n次,空間複雜度o(n*1)=o(n)。
1:實現二分查詢演算法的遞迴及非遞迴。(分析時間複雜度及空間複雜度)
迭代演算法
1#define _crt_secure_no_warnings
23 #include4 #include
5 #include6
7int binarysearch(int arr, int len, int
num)823
else
if (num 2427
else
2831}32
33return -1;34
}353637
38int
main()39;
41int length = sizeof(arr) / sizeof(arr[0
]);42
int aim = 9;43
intresult;
4445 result =binarysearch(arr, length, aim);
4647
if (result == -1)48
51else
5255
5657
return0;
58 }
二分查詢時,每次都在原有查詢內容進行二分,所以時間複雜度為o(log2 n)
因為變數值建立一次,所以空間複雜度為o(1)
遞迴演算法
1int binarysearchrecursion(int arr[5], int lef, int rig,int
aim)213
else
if (arr[mid] 18else
if (aim ==arr[mid])
192223}
24else
25return -1;26
27}2829
30int
main()31;
33int sz = sizeof(arr)/sizeof(arr[0
]);34
intresult;
3536 result = binarysearchrecursion(arr, 0, sz - 1, 4
);37
38if (-1 ==result)
3942
else
43 printf("
aim at %d location\n
", result+1
);44 }
時間複雜度為o(log2 n)
每進行一次遞迴都會建立變數,所以空間複雜度為o(log2 n)
2:實現斐波那契數列的遞迴及非遞迴。(分析時間複雜度及空間複雜度)
迭代演算法
1int feibonacciinteration(int a,int b,int
num)220
return
c;21}22
23}2425
intmain()
2638
else
3942
43return0;
44 }
時間複雜度o(n)
空間複雜度為o(1)
遞迴演算法
1int feibonaccirecursion(int
num)211
12int
main()
13
時間複雜度為o(2^n)
空間複雜度為o(n)
---------------------
原文:
演算法複雜度 時間複雜度和空間複雜度
1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...
演算法複雜度 時間複雜度和空間複雜度
演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...
演算法複雜度 時間複雜度和空間複雜度
演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...