其實求時間複雜度的方法就是找出執行得最多的語句然後判斷其量級罷了,只是有時候不太容易直接看出來,所以需要用假設的方式輔助輔助
for(int i=0;i<n;i=i*3)
cout<<"hehe"<<endl;
如上這段代碼,執行最頻繁者不過是那句輸出語句罷了,執行了多少次呢?我們按以下方法推演便知:
執行次數 i的值
1 3
2 3**2
3 3**3
.... ....
k 3**k
假設執行到k次的時候結束,結束條件是3**k大於等於n了,方便計算,我們取等於既是:3**k=n。k就是我們要求的時間複雜度!
由此我們可以推出,上述例子的時間複雜度爲log3n。
那麼有時候是遞歸的函數怎麼解?如下例子
void f(int n){
if(n==0) return;
else return f(n/3);
}
其實和上面的例子一樣,我們也是按照遞推的方式推演得出結果:
執行次數 n的值(或者在此遞歸傳入的值)
1 n
2 n/3
3 n/(3**2)
,,, ....
k n/(3**k)
當n等於0的時候結束循環,爲方便計算,我們取k=0時候結束.(此處描述不太準確,意會即可)
n/(3**k)=1 我們還是可以解出時間複雜度爲log3n
最後來一個稍稍難一點的:
int i=0;
int s=0;
while(s<n){
i++;
s=s+i;
}
執行次數 i的值 s的值
1 1 1
2 2 1+2
3 3 1+2+3
... ... ...
k k 1+2+3+...k
1+2+3+...+k=n
(1+k)K/2=n
k=sqrt(n)