簡單理解時間複雜度和空間複雜度,通俗易懂

 

時間複雜度和空間複雜度一般是針對算法而言,是衡量一個算法是否高效的重要標準。先糾正一個誤區,時間複雜度並不是算法執行的時間,再糾正一個誤區,算法不單單指冒泡排序之類的,一個循環甚至是一個判斷都可以稱之爲算法。其實理解起來並不衝突,八大排序甚至更多的算法本質上也是通過各種循環判斷來實現的。

時間複雜度指算法語句的執行次數。一個算法語句的執行次數最終都是可以通過函數f(n)來表示的,例如:

int x = 1;
while(x < 10){
    x ++;
}
這裏的x++就是算法語句,其f(n)=10-x

for(int i = 0;i < n;i++){
    for(int j = 0;j < n;j++){
        System.out.println("-");
    }
}
這裏的System.out.println就是算法語句,其f(n)如下圖

int i = 0;
while(i < n){
    i ++;
}
 i++即算法語句,被執行次數爲f(n)=n-i

理解了如何將算法語句執行次數通過函數表示出來,時間複雜度一眼就看出來了,有以下幾條規則

1.選取f(n)係數最大的項,如果係數都是負數,就選常數,那麼時間複雜度是常數階O(1)

2.根據第一條拿到係數最大項後,將係數化爲1,剩下的就是時間複雜度

3.一個算法可能有多條算法語句,即可能有多個循環判斷,時間複雜度的計算考慮最壞情況,即取最大的。

根據以上3個規則,前面三個例子的時間複雜度分別爲

空間複雜度就是一個算法在運行過程中臨時佔用的存儲空間大小,換句話說就是被創建次數最多的變量,它被創建了多少次,那麼這個算法的空間複雜度就是多少。舉個例子:

for(int i=0;i<n;++){
int temp = i;
}

int temp=0;
for(int i=0;i<n;i++){
temp = i;
}
前者空間複雜度就是O(n),而後者空間複雜度就是O(1)常數階。很好理解,前者每循環一次都會重新創建一個temp對象,而後者只在循環外面創建了一個temp對象,每次循環只是給他不同的引用而已。所以有個規律,如果算法語句中就有創建對象,那麼這個算法的時間複雜度和空間複雜度一般一致,很好理解,算法語句被執行了多少次就創建了多少對象。

此博客爲讓自己牢記時間複雜度和空間複雜度。只爲知識學習與分享!如有侵權,請聯繫刪除!

源鏈接:作者:滴哩哩哩滴哩哩哩噠噠

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章