資料結構與演算法02

bigpengry發表於2019-01-05

時間複雜度

時間複雜度是演算法中一個很重要的概念,是用與衡量一個演算法執行快慢的標準。最壞時間複雜度用大O(n)表示

   int sum = 0;
   int i = 1;
   for (; i <= n; ++i) {
        sum = sum + i;
   }
   return sum;
 }
複製程式碼

例如上面這段程式碼,它的最壞時間複雜度就為O(n)。那麼,這個結果是如何得出的呢。這段程式碼從第一行開始執行,然後到了for迴圈,此時程式碼執行了兩次,然後for迴圈是從i=1,直到i>n,程式才會跳出for迴圈,那麼程式在這個for迴圈中執行了n次。然後接著看for迴圈中的語句,這個語句隨著for迴圈執行了n次。最後就到了return語句,此時程式碼結束執行。那麼把他們加起來就是O(2n+2)。在時間複雜度的計算中,我們引入了一個很重要的概念就是數量級,這句話是什麼意思呢。O(2n+2)這個時間複雜度中有兩個常數,把這兩個常數忽略,就得到了O(n)。舉個例子,當n→∞時,不論是2n還是10n,100n,都等於n,這是因為n就是無窮大了,那麼不論n乘上任何常數都是無窮大。除非n*n或者n乘或除任何含有n的的式子。O(logn)、O(n)、O(nlogn)、O(n²)這是幾個常見的時間複雜度。

空間複雜度

空間複雜度就是在演算法運算的過程中,是否使用了額外空間來儲存或輔助資料進行運算。

void print(int n) {
  int i = 0;
  int[] a = new int[n];
  for (i; i <n; ++i) {
    a[i] = i * i;
  }

  for (i = n-1; i >= 0; --i) {
    print out a[i]
  }
}
複製程式碼

例如上面這段程式碼,第一行宣告瞭一個i的變數,第二行我們開闢了一個大小為n的陣列來進行輔助儲存資料,那麼這段程式碼的空間複雜度就為O(n+1),和時間複雜度一樣,對於常數,我們依然可以忽略,那麼最終的空間複雜度就為O(n).

相關文章