(1)for迴圈
一次for迴圈的執行時間至多是該for迴圈內語句的執行時間乘以迭代次數。
(2)巢狀的for迴圈
肯定是計算最內層迴圈語句的執行次數,然後再乘以所以迴圈的迭代次數。
(3)整個程式
其實找到迴圈迭代次數最多,巢狀最多的進行計算就好。
3、當然,我們計算的只是大概值,而且為了計算的簡便,我們一邊進行適當的放大,即只考慮最壞最壞的情況,算出其時間複雜度即可。
二、最大子串行
書中通過4種不同的解法來進一步強化我們應該如何計算時間複雜度,小白我也好好學習了下,在此寫下學習筆記。
題目:算出乙個整數序列中最大的子串行的值。
演算法一:
int maxsubsequencesum1(const int a,int n)
if(thissum>maxsum)}}
if(maxsum==0)
if(i!=n)
}maxsum=max;}}
return maxsum;
}我們可以看出其最大的for迴圈有三重,而且最壞的可能迭代次數都是n,所以我們可以很容易的得出,此演算法的時間複雜度為o(n^3),其中資源最明顯的浪費就在重複計算了從低i到第k的子串行的值,所以演算法二便是進行了簡單的修改。
演算法二:
int maxsubsequencesum2(const int a,int n)}}
if(maxsum==0)
if(i!=n)
}maxsum=max;}}
return maxsum;
}其實改變的地方即使採用的累加的策略而已,但卻使效率大大的提高了,所以這裡也是提高演算法效率的乙個小小的技巧,即盡力減少不必要的計算,盡量利用現有的計算結果。
演算法三:
int max3(const int a,const int b,const int c)
int maxsubsum(const int a,int left,int right)
int center=(right+left)/2;
maxleftsum=maxsubsum(a, left, center);
maxrightsum=maxsubsum(a, center+1, right);
leftbordersum=maxleftbordersum=0;
for(int i=center;i>=left;i--)
}rightbordersum=maxrightbordersum=0;
for(int i=center+1;i<=right;i++)
}return max3(maxleftsum,maxrightsum,maxleftbordersum+maxrightbordersum);
}int maxsubsequencesum3(const int a,int n)
if(i!=n)
}maxsum=max;}}
return maxsum;
}這個演算法使用了分治的思想,還有遞迴的思想,即把乙個問題不斷的分解成類似的規模更小的子問題來解決,所以這裡我們要求乙個序列的最大子串行,其實就是求左半部分,有伴部分和中間部分的最大子串行,而求左半部分,後半部分的最大子串行顯然是將問題的規模變小了,所以可以遞迴使用,直到剩下乙個數的情況.而中間部分呢,則取左右兩邊,左邊從右往左,右邊從左往右的最大子串行。然後加起來作為中間部分的值,最後比較中間部分,左半部分,後半部分三部分的值就可以得到結果啦。
演算法四:
int maxsubsequencesum4(const int a,int n)
else if(thissum<0)
}if(maxsum==0)
if(i!=n)
}maxsum=max;}}
return maxsum;
}
資料結構 時間複雜度計算
1.演算法的特性 輸入 input 乙個演算法有0個或多個輸入,以刻畫運算物件的初始情況,所謂0個輸入是指演算法本身定出了初始條件 輸出 output 乙個演算法有乙個或多個輸出,以反映對輸入資料加工後的結果。沒有輸出的演算法是毫無意義的。可以在控制台列印輸出或者返回乙個或多個值等。確定性 defi...
資料結構 時間複雜度計算
1.演算法的特性 輸入 input 乙個演算法有0個或多個輸入,以刻畫運算物件的初始情況,所謂0個輸入是指演算法本身定出了初始條件 輸出 output 乙個演算法有乙個或多個輸出,以反映對輸入資料加工後的結果。沒有輸出的演算法是毫無意義的。可以在控制台列印輸出或者返回乙個或多個值等。確定性 defi...
資料結構 時間複雜度 空間複雜度
1.演算法效率 演算法效率可以用來衡量乙個演算法的好壞 演算法效率分析分為兩種 第一種是時間效率,第二種是空間效率.時間效率被稱為時間複雜度,空間效率被稱為空間複雜度.時間複雜度主要衡量的是乙個演算法的執行速度,而空間複雜度主要衡量乙個演算法所需要的額外空間,在計算機發展的早期,計算機的儲存容量很小...