引言
算法是程序的靈魂,想學好算法就必須先搞懂時間復雜度
算時間復雜度就是算基本語句條數
5個計算時間復雜度基礎例題
例題一
for(int i=0; i<n; i++){
for(int j=i; j<n; j++){
System.out.println("執行一次");
}
}
i=0時,j=0,j循環執行n次
i=1時,j=1,j循環執行n-1次
i=2時,j=2,j循環執行n-2次
推廣到
i=n-1時,j=n-1,j循環執行1次
Sn=n+n-1+n-2+...+1=n×(n+1)/2
時間復雜度為:O(n²)
例題二
i=0;
while((i+1)*(i+1)<=n){
i++;
}
第1次,i=1
第2次,i=2
推廣到
第x次,i=x
設第x次退出循環,則(i+1)×(i+1)>n
x=i>(√n)-1 次
時間復雜度為:O(√n)
例題三
int i=1;
while(i<n){
i = i*2;
}
第1次:i=21
第2次:i=22
第3次:i=23
......
第x次:i=2x
設第x次退出循環,則有i=2x ≥ n
取對數解得x=logn,共執行logn次
時間復雜度為:O(logn)
例題四
for(int i=1; i<=n; i++){
for(int j=1; j<=i; j++){
for(int k=1; k<=j; k++){
System.out.println("執行一次");
}
}
}
粗略的估計:
最外層i循環n次,j循環最壞的情況執行n次,k循環最壞的情況也執行n次,即時間復雜度為O(n³)
詳細計算:
i=1時,j、k循環都只執行一次,輸出語句執行1次
i=2時,j循環[1,2]執行2次,每一次分別有一個k循環,分別是[1,1]、[1,2]輸出語句執行1+2次
i=3時,j循環[1,3]執行3次,每一次分別有一個k循環,分別是[1,1]、[1,2]、[1,3]輸出語句執行1+2+3次
可以推廣到
i=n時,j循環[1,n]執行n次,每一次分別有一個k循環,分別是[1,1]、[1,2]......[1,n]輸出語句執行1+2+......+n次
總共:Sn=(1)+(1+2)+(1+2+3)+......+(1+2+3+...+n)
1~n項和取n²放大一點看就是n個這樣的n²相加,即n³
時間復雜度為:O(n³)
例題五
for(int i=0; i<n; i++){
for(int j=2*i; j<n; j++){
System.out.println("執行一次");
}
}
粗略的估計
i=0時,j=0,內循環n次
即時間復雜度為O(n²)
詳細計算
i=0時,j=0,[0,n)內循環n次
i=1時,j=2,[2,n)內循環n-2次
i=2時,j=4,[4,n)內循環n-4次
推廣到
i=(n/2)-1,j=n-2,[n-2,n)內循環2次
i=n/2時,j=n,跳出循環
綜上Sn=n+n-2+n-4+...+2
共n/2項,首項為n,公差-2
Sn=(((n/2)×[(n/2)-1)]×(-2)/2) + (n/2)×n
輸出語句執行了(n²+2n)/4次
時間復雜度為:O(n²)
總結
一定要學會算時間復雜度
很重要
很重要
很重要