【轉載】算法的時間空間複雜度

【轉載】https://www.cnblogs.com/zknublx/p/5885840.htmlhtml

常見的算法時間複雜度由小到大依次爲:Ο(1)<Ο(log2n)<Ο(n)<Ο(nlog2n)<Ο(n2)<Ο(n3)<…<Ο(2n)<Ο(n!)java

(5)下面分別對幾個常見的時間複雜度進行示例說明:程序員

(1)、O(1)算法

        Temp=i; i=j; j=temp;                    數組

以上三條單個語句的頻度均爲1,該程序段的執行時間是一個與問題規模n無關的常數。算法的時間複雜度爲常數階,記做T(n)=O(1)。注意:若是算法的執行時間不隨着問題規模n的增長而增加,即便算法中有上千條語句,其執行時間也不過是一個較大的常數。此類算法的時間複雜度是O(1)。函數

(2)、O(n2)spa

2.1. 交換i和j的內容.net

  1. sum=0;                 (一次)  
  2. for(i=1;i<=n;i++)     (n+1次)  
  3.    for(j=1;j<=n;j++) (n2次)  
  4.     sum++;            (n2次)  

解:由於Θ(2n2+n+1)=n2(Θ即:去低階項,去掉常數項,去掉高階項的常參獲得),因此T(n)= =O(n2);指針

2.2.   htm


 
 
  1. for (i=1;i<n;i++)  
  2.  {   
  3.      y=y+1;         ①     
  4.      for (j=0;j<=(2*n);j++)      
  5.         x++;         ②        
  6.  }            

解: 語句1的頻度是n-1
          語句2的頻度是(n-1)*(2n+1)=2n2-n-1
          f(n)=2n2-n-1+(n-1)=2n2-2;

        又Θ(2n2-2)=n2
          該程序的時間複雜度T(n)=O(n2).  

  通常狀況下,對步進循環語句只需考慮循環體中語句的執行次數,忽略該語句中步長加一、終值判別、控制轉移等成分,當有若干個循環語句時,算法的時間複雜度是由嵌套層數最多的循環語句中最內層語句的頻度f(n)決定的。     

(3)、O(n)                                                              


 
 
  1. a=0;  
  2.   b=1;                      ①  
  3.   for (i=1;i<=n;i++) ②  
  4.   {    
  5.      s=a+b;    ③  
  6.      b=a;     ④    
  7.      a=s;     ⑤  
  8.   }  

解: 語句1的頻度:2,        
           語句2的頻度: n,        
          語句3的頻度: n-1,        
          語句4的頻度:n-1,    
          語句5的頻度:n-1,                                  
          T(n)=2+n+3(n-1)=4n-1=O(n).
(4)、O(log2n)


 
  1. i=1;     ①  
  2. hile (i<=n)  
  3.   i=i*2; ②  

解: 語句1的頻度是1,  
          設語句2的頻度是f(n),   則:2^f(n)<=n;f(n)<=log2n    
          取最大值f(n)=log2n,
          T(n)=O(log2n )

(5)、O(n3) 


 
  1. for(i=0;i<n;i++)  
  2.    {    
  3.       for(j=0;j<i;j++)    
  4.       {  
  5.          for(k=0;k<j;k++)  
  6.             x=x+2;    
  7.       }  
  8.    }  

解:當i=m, j=k的時候,內層循環的次數爲k當i=m時, j 能夠取 0,1,...,m-1 , 因此這裏最內循環共進行了0+1+...+m-1=(m-1)m/2次因此,i從0取到n, 則循環共進行了: 0+(1-1)*1/2+...+(n-1)n/2=n(n+1)(n-1)/6因此時間複雜度爲O(n3).

(5)經常使用的算法的時間複雜度和空間複雜度

一個經驗規則:其中c是一個常量,若是一個算法的複雜度爲c 、 log2n 、n 、 n*log2n ,那麼這個算法時間效率比較高 ,若是是2n ,3n ,n!,那麼稍微大一些的n就會令這個算法不能動了,居於中間的幾個則差強人意。

       算法時間複雜度分析是一個很重要的問題,任何一個程序員都應該熟練掌握其概念和基本方法,並且要善於從數學層面上探尋其本質,才能準確理解其內涵。

二、算法的空間複雜度

        相似於時間複雜度的討論,一個算法的空間複雜度(Space Complexity)S(n)定義爲該算法所耗費的存儲空間,它也是問題規模n的函數。漸近空間複雜度也經常簡稱爲空間複雜度。
空間複雜度(Space Complexity)是對一個算法在運行過程當中臨時佔用存儲空間大小的量度。一個算法在計算機存儲器上所佔用的存儲空間,包括存儲算法自己所佔用的存儲空間,算法的輸入輸出數據所佔用的存儲空間和算法在運行過程當中臨時佔用的存儲空間這三個方面。算法的輸入輸出數據所佔用的存儲空間是由要解決的問題決定的,是經過參數表由調用函數傳遞而來的,它不隨本算法的不一樣而改變。存儲算法自己所佔用的存儲空間與算法書寫的長短成正比,要壓縮這方面的存儲空間,就必須編寫出較短的算法。算法在運行過程當中臨時佔用的存儲空間隨算法的不一樣而異,有的算法只須要佔用少許的臨時工做單元,並且不隨問題規模的大小而改變,咱們稱這種算法是「就地\"進行的,是節省存儲的算法,如這一節介紹過的幾個算法都是如此;有的算法須要佔用的臨時工做單元數與解決問題的規模n有關,它隨着n的增大而增大,當n較大時,將佔用較多的存儲單元,例如將在第九章介紹的快速排序和歸併排序算法就屬於這種狀況。

如當一個算法的空間複雜度爲一個常量,即不隨被處理數據量n的大小而改變時,可表示爲O(1);當一個算法的空間複雜度與以2爲底的n的對數成正比時,可表示爲0(10g2n);當一個算法的空I司複雜度與n成線性比例關係時,可表示爲0(n).若形參爲數組,則只須要爲它分配一個存儲由實參傳送來的一個地址指針的空間,即一個機器字長空間;若形參爲引用方式,則也只須要爲其分配存儲一個地址的空間,用它來存儲對應實參變量的地址,以便由系統自動引用實參變量。

相關文章
相關標籤/搜索