我們假設計算機執行一行基礎**需要執行一次運算。
int afunc(void)
那麼上面這個方法需要執行 2 次運算
int afunc(int n)
}
此時時間複雜度為 o(n × 1),即 o(n)。
2、對於多個迴圈,假設迴圈體的時間複雜度為 o(n),各個迴圈的迴圈次數分別是a, b, c…,則這個迴圈的時間複雜度為 o(n×a×b×c…)。分析的時候應該由里向外分析這些迴圈。
void afunc(int n)
}}
此時時間複雜度為 o(n × n × 1),即 o(n^2)。
3、對於順序執行的語句或者演算法,總的時間複雜度等於其中最大的時間複雜度。
void afunc(int n)
}// 第二部分時間複雜度為 o(n)
for(int j = 0; j < n; j++)
}
此時時間複雜度為 max(o(n^2), o(n)),即 o(n^2)。
4、對於條件判斷語句,總的時間複雜度等於其中 時間複雜度最大的路徑 的時間複雜度。
void afunc(int n)
}} else
}}
此時時間複雜度為 max(o(n^2), o(n)),即 o(n^2)。
時間複雜度分析的基本策略是:從內向外分析,從最深層開始分析。如果遇到函式呼叫,要深入函式進行分析。
最後,我們來練習一下
一. 基礎題
求該方法的時間複雜度
void afunc(int n)
}}
參***:
當 i = 0 時,內迴圈執行 n 次運算,當 i = 1 時,內迴圈執行 n - 1 次運算……當 i = n - 1 時,內迴圈執行 1 次運算。
所以,執行次數 t(n) = n + (n - 1) + (n - 2)……+ 1 = n(n + 1) / 2 = n^2 / 2 + n / 2。
根據上文說的 大o推導法 可以知道,此時時間複雜度為 o(n^2)。
二. 高階題
求該方法的時間複雜度
void afunc(int n)
}
參***:
假設迴圈次數為 t,則迴圈條件滿足 2^t < n。
可以得出,執行次數t = log(2)(n),即 t(n) = log(2)(n),可見時間複雜度為 o(log(2)(n)),即 o(log n)。
三. 再次高階
求該方法的時間複雜度
long afunc(int n) else
}
參***:
顯然執行次數,t(0) = t(1) = 1,同時 t(n) = t(n - 1) + t(n - 2) + 1,這裡的 1 是其中的加法算一次執行。
顯然 t(n) = t(n - 1) + t(n - 2) 是乙個斐波那契數列,通過歸納證明法可以證明,當 n >= 1 時 t(n) < (5/3)^n,同時當 n > 4 時 t(n) >= (3/2)^n。
所以該方法的時間複雜度可以表示為 o((5/3)^n),簡化後為 o(2^n)。
可見這個方法所需的執行時間是以指數的速度增長的。如果大家感興趣,可以試下分別用 1,10,100 的輸入大小來測試下演算法的執行時間,相信大家會感受到時間複雜度的無窮魅力。
dfs時間複雜度 時間複雜度 空間複雜度
時間複雜度的數學證明方法相對比較複雜,通常在工程實際中,會分析就好。注意 只看最高複雜度的運算 int for for for for int遞迴如何分析時間複雜度?常數係數可以忽略,在分析時不用考慮,只要說以上術語即可。主定理 master throrem 上述第四種是歸併排序,所有排序演算法,最...
時間複雜度 空間複雜度
時間複雜度 在電腦科學中,演算法的時間複雜度是乙個函式,它定性描述了該演算法的執行時間。這是乙個關於代表演算法輸入值的字串 的長度的函式。時間複雜度常用大o符號 表述,不包括這個函式的低階項和首項係數。計算時間複雜度的方法 1 只保留高階項,低階項直接丟棄 2 係數不要 3 執行次數是常數是為o 1...
時間複雜度 空間複雜度
演算法複雜度分為時間複雜度和空間複雜度。其作用 時間複雜度是指執行演算法所需要的計算工作量 而空間複雜度是指執行這個演算法所需要的記憶體空間。一 時間複雜度 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道...