時間複雜度的計算

1.算法的效率

  兩個維度算法

    時間複雜度 :評估執行程序所需的時間。能夠估算出程序對處理器的使用程度。函數

    空間複雜度 : 評估執行程序所需的存儲空間。能夠估算出程序對計算機內存的使用程度。spa

2.時間複雜度

  時間頻度 一個算法的執行時間與語句執行次數成正比,一個算法中語句執行的次數稱爲語句頻度或者是時間頻度。記爲 T(n) .net

  時間複雜度  code

    前面提到的時間頻度T(n)中,n稱爲問題的規模,當n不斷變化時,時間頻度T(n)也會不斷變化。但有時咱們想知道blog

  它變化時呈現什麼規律,爲此咱們引入時間複雜度的概念。通常狀況下,算法中基本操做重複執行的次數是問題規模n內存

  的某個函數,用T(n)表示,如有某個輔助函數f(n),使得當n趨近於無窮大時,T(n)/f(n)的極限值爲不等於零的常數,則稱get

  f(n)是T(n)的同數量級函數,記做T(n)=O(f(n)),它稱爲算法的漸進時間複雜度,簡稱時間複雜度。  it

 

3.大O表示法

  像前面用O( )來體現算法時間複雜度的記法,咱們稱之爲大O表示法。 class

  推導大O階 
  推導大O階,咱們能夠按照以下的規則來進行推導,獲得的結果就是大O表示法: 
  1.用常數1來取代運行時間中全部加法常數。 
  2.修改後的運行次數函數中,只保留最高階項 
  3.若是最高階項存在且不是1,則去除與這個項相乘的常數。

  常數階
先舉了例子,以下所示。

  int sum = 0,n = 100; //執行一次  
  sum = (1+n)*n/2; //執行一次  
  System.out.println (sum); //執行一次 


上面算法的運行的次數的函數爲f(n)=3,根據推導大O階的規則1,咱們須要將常數3改成1,則這個算法的時間複雜度爲O(1)。若是sum = (1+n)*n/2這條語句再執行10遍,由於這與問題大小n的值並無關係,因此這個算法的時間複雜度仍舊是O(1),咱們能夠稱之爲常數階。

線性階
線性階主要要分析循環結構的運行狀況,以下所示。

for(int i=0;i<n;i++){
//時間複雜度爲O(1)的算法
...
}


上面算法循環體中的代碼執行了n次,所以時間複雜度爲O(n)。

對數階
接着看以下代碼:

int number=1;
while(number<n){
number=number*2;
//時間複雜度爲O(1)的算法
...
}

能夠看出上面的代碼,隨着number每次乘以2後,都會愈來愈接近n,當number不小於n時就會退出循環。假設循環的次數爲X,則由2^x=n得出x=log₂n,所以得出這個算法的時間複雜度爲O(logn)。

平方階
下面的代碼是循環嵌套:

  for(int i=0;i<n;i++){   
      for(int j=0;j<n;i++){
         //複雜度爲O(1)的算法
         ...
      }
  }


內層循環的時間複雜度在講到線性階時就已經得知是O(n),如今通過外層循環n次,那麼這段算法的時間複雜度則爲O(n²)。
接下來咱們來算一下下面算法的時間複雜度:

  for(int i=0;i<n;i++){   
      for(int j=i;j<n;i++){
         //複雜度爲O(1)的算法
         ...
      }
  }


須要注意的是內循環中int j=i,而不是int j=0。當i=0時,內循環執行了n次;i=1時內循環執行了n-1次,當i=n-1時執行了1次,咱們能夠推算出總的執行次數爲:

n+(n-1)+(n-2)+(n-3)+……+1
=(n+1)+[(n-1)+2]+[(n-2)+3]+[(n-3)+4]+……
=(n+1)+(n+1)+(n+1)+(n+1)+……
=(n+1)n/2
=n(n+1)/2
=n²/2+n/2

根據此前講過的推導大O階的規則的第二條:只保留最高階,所以保留n²/2。根據第三條去掉和這個項的常數,則去掉1/2,最終這段代碼的時間複雜度爲O(n²)。

其餘常見覆雜度

除了常數階、線性階、平方階、對數階,還有以下時間複雜度:
f(n)=nlogn時,時間複雜度爲O(nlogn),能夠稱爲nlogn階。
f(n)=n³時,時間複雜度爲O(n³),能夠稱爲立方階。
f(n)=2ⁿ時,時間複雜度爲O(2ⁿ),能夠稱爲指數階。
f(n)=n!時,時間複雜度爲O(n!),能夠稱爲階乘階。
f(n)=(√n時,時間複雜度爲O(√n),能夠稱爲平方根階。
---------------------

 

點贊好用: http://www.javashuo.com/article/p-rbpjupqq-nc.html

相關文章
相關標籤/搜索