十分鐘搞定時間複雜度(演算法的時間複雜度)

2021-08-22 09:56:27 字數 1780 閱讀 8146

我們假設計算機執行一行基礎**需要執行一次運算。

int afunc(void)
那麼上面這個方法需要執行 2 次運算

int afunc(int n) 

}

此時時間複雜度為 o(n × 1),即 o(n)。

對於多個迴圈,假設迴圈體的時間複雜度為 o(n),各個迴圈的迴圈次數分別是a, b, c...,則這個迴圈的時間複雜度為 o(n×a×b×c...)。分析的時候應該由里向外分析這些迴圈。

void afunc(int n) 

}}

此時時間複雜度為 o(n × n × 1),即 o(n^2)。

對於順序執行的語句或者演算法,總的時間複雜度等於其中最大的時間複雜度。

void afunc(int n) 

}// 第二部分時間複雜度為 o(n)

for(int j = 0; j < n; j++)

}

此時時間複雜度為 max(o(n^2), o(n)),即 o(n^2)。

對於條件判斷語句,總的時間複雜度等於其中 時間複雜度最大的路徑 的時間複雜度。

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 的輸入大小來測試下演算法的執行時間,相信大家會感受到時間複雜度的無窮魅力。

十分鐘搞定pandas

本文是對pandas官方 上 10 minutes to pandas 的乙個簡單的翻譯,原文在這裡。這篇文章是對pandas的乙個簡單的介紹,詳細的介紹請參考 cookbook 習慣上,我們會按下面格式引入所需要的包 可以通過 data structure intro setion 來檢視有關該節...

十分鐘的代價

2008年9月15日上午10 00,擁有158年歷史的美國第四大投資銀行 雷曼兄弟公司向法院申請破產保護,訊息轉瞬間通過電視 廣播和網路傳遍地球的各個角落。令人匪夷所思的是,在如此重大的情況下,德國國家發展銀行在十分鐘後,居然按照外匯掉期協議的交易,通過計算機自動付款系統,向雷曼兄弟公司即將凍結的銀...

十分鐘的悲劇

2008年9 月15日上午 10 00 擁有158 年歷史的美國第四大投資銀行 雷曼兄弟公司向法院申請破產保護,訊息轉瞬間通過電視 廣播和網路傳遍地球的各個角落。令人匪夷所思的是,在如此明朗的情況下,德國國家發展銀行 10 10 居然按照外匯掉期協議的交易,通過計算機自動付款系統,向雷曼兄弟公司即將...