時間複雜度
時間複雜度是演算法中一個很重要的概念,是用與衡量一個演算法執行快慢的標準。最壞時間複雜度用大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).