1、階數比較ide
時間複雜度判斷理論:O(1) <= O(log2(n)) <= O(n) <= O(n*log2(n)) <= O(n^2) <=...<=O(n^k) <= O(2^n)blog
2、計算方法it
用常數1代替運行時間中的全部加法常數for循環
修改後的運行次數中只保留最高階項class
去除最高階項的係數循環
3、常見的求時間複雜度例子方法
一、常數階im
int a=1; int b=a+2;
這種只執行常數規模的狀況時間複雜度是O(1)img
二、對數階(O(log2n))di
1 int n=100; 2 int i=1; 3 while(i<=n){ 4 i=i*1; 5 }
在while循環裏每次都將i乘以2,i距離n愈來愈近,若是循環x次以後i大於n此時這個循環退出也就是說2的x次方等於n那麼x=log2n也就是說當循環log2n次之後,這個代碼就結束了,此時這個短髮的時間複雜度是O(log2n),o(LOG2n)的這個n是隨着代碼變化的,若是裏面不是2倍遞增則將發生相應變化eg:i=i*3 則時間複雜度爲O(log3n)
三、線性階
1 int j=0; 2 for(int i=1;i<=n;i++){ 3 j++; 4 }
這個代碼,for循環裏面的代碼會執行n編,所以它消耗的時間是隨着n的變化而變化O(n)
四、線性對數階O(nlogN)
1 int j=0; 2 for(int i=1;i<=n;i++){ 3 j=1; 4 while(j<n){ 5 j=j*2; 6 } 7 }
線性對數階O(nlogN) 其實很是容易理解,將時間複雜度爲O(logn)的代碼循環N遍的話,那麼它的時間複雜度就是 n * O(logN),也就是了O(nlogN)。
五、平方階O(n2)
1 int a=0; 2 for(int i=1;i<=n;i++){ 3 for(int j=1;j<=n;j++){ 4 a=a+1; 5 j++; 6 } 7 }
若是把 O(n) 的代碼再嵌套循環一遍,它的時間複雜度就是 O(n²),這段代碼其實就是嵌套了2層n循環,它的時間複雜度就是 O(nn),即 O(n²) 若是將其中一層循環的n改爲m,那它的時間複雜度就變成了 O(mn)
1 for(i=o;i<n;i++){ 2 3 for(j=i;j<n;j++){ 4 5 } 6 7 }
這裏分析下,當i=0的時候,J能夠循環N次,i=1的時候,J循環N-1次,因此得出:
n+n-1+n-2+.....+1=(n+1)*n/2=N^2/2+N/2;也是O(n2)
六、k次方階
同2次方階