1.時間復雜度與漸進時間復雜度
https://blog.csdn.net/mingyuli/article/details/82380107
算法時間復雜度的本質是算法的執行時間,也就是算法中所有語句的頻度之和。
當問題規模很大時,精確的計算是很難實現而且也是沒有必要的,引入了漸進時間復雜度作為時間性能分析的依據。
漸進時間復雜度可以簡稱為時間復雜度,記為T(n)=O(f(n))。
2.估計漸進
https://zhuanlan.zhihu.com/p/132396715,這個博文寫的不錯。
通常,在評估時間復雜度的時候,我們會忽略掉兩個部分,一個部分是低階,另一個部分是常數階。
- O 漸進符號定義了一個算法的上限,也就是我們說的最壞時間復雜度。例如,插入排序,最佳的情況下的時間復雜度是 O(n),而最壞的情況是 O(n²),所以我們可以說插入排序的事件復雜度是 O(n²)
- Θ 漸進符號表示的是一個算法從上限到下限的時間復雜度。如果使用Θ表示插入排序的事件復雜度,則需要如下:
- 插入排序的最壞時間復雜度為 Θ(n²)
- 插入排序的最佳時間復雜度為 Θ(n)
Ω 漸進符號表示一個算法的下限,也就是我們說的最佳時間復雜度。這個符號使用的最少。
3.以for循環為例說明幾種漸進
轉自上面知乎專欄
O(1):
int c = 100; for (int i = 1; i <= c; i++){ // 執行 O(1) 的循環體 }
O(n):
for (int i = 0; i < n; i = i+c){ // do O(1) }
O(n^2):
// n 表示用戶輸入;c 表示常數 for (int i = 1; i <= n; i += c) { for (int k = 1; k <= n; k += c) { // do O(1) } }
O(logn):
// n 表示用戶輸入;c 表示常數 for (int i = 0; i <= n; i *= c) { // do O(1) }
O(LogLogn):
// n 表示用戶輸入;c 表示常數 // pow 表示 i^c for (int i = 2; i < n; i = Math.pow(i, c)) { // do O(1) }
O(nLogn):
public void fun(int n) { for (int i = 0; i < n; i++ ){ for (int k = 1; k < n; k = k*2){ // do O(1) } } }
4.常見漸進總結
按數量級遞增排列,常見的時間復雜度有:
常數階O(1)、對數階O(log2n)、線性階O(n)、線性對數階O(nlog2n)、平方階O(n2),立方階O(n3)、k次方階O(nk)、指數階O(2n)。隨着問題規模n的不斷增大,上述時間復雜度不斷增大,算法的執行效率越低。
https://www.bilibili.com/read/cv5788376/