資料結構與演算法之美 複雜度分析

2021-10-14 03:18:50 字數 1517 閱讀 4088

因為我們需要乙個不用具體的測試資料來測試,就可以粗略估計演算法的執行效率的方法。

演算法的執行效率,粗略地講,就是演算法**執行的時間。

舉個例子

int

cal(

int n)

}}

首先,所有**的執行時間 t(n) 與每行**的執行次數成正比。

我們依舊假設每個語句的執行時間是 unit_time。那這段**的總執行時間 t(n) 是多少呢?

第 2、3、4 行**,每行都需要 1 個 unit_time 的執行時間,第 5、6 行**迴圈執行了 n 遍,需要 2n * unit_time 的執行時間,第 7、8 行**迴圈執行了 n2遍,所以需要 2n2 * unit_time 的執行時間。

所以,整段**總的執行時間 t(n) = (2n2+2n+3)*unit_time。

儘管我們不知道 unit_time 的具體值,但是通過這兩段**執行時間的推導過程,我們可以得到乙個非常重要的規律,那就是,所有**的執行時間 t(n) 與每行**的執行次數 n 成正比。

我來具體解釋一下這個公式。其中,t(n) 我們已經講過了,它表示**執行的時間;n 表示資料規模的大小;f(n) 表示每行**執行的次數總和。因為這是乙個公式,所以用 f(n) 來表示。公式中的 o,表示**的執行時間 t(n) 與 f(n) 表示式成正比。

這就是大 o 時間複雜度表示法。大 o 時間複雜度實際上並不具體表示**真正的執行時間,而是表示**執行時間隨資料規模增長的變化趨勢,所以,也叫作漸進時間複雜度(asymptotic time complexity),簡稱時間複雜度

一般來說,我們只記錄最大量級。即t(n) = o(n2)。

如何分析一段**的時間複雜度?三個比較實用的方法如下。

我剛才說了,大 o 這種複雜度表示方法只是表示一種變化趨勢。我們通常會忽略掉公式中的常量、低階、係數,只需要記錄乙個最大階的量級就可以了。所以,我們在分析乙個演算法、一段**的時間複雜度的時候,也只關注迴圈執行次數最多的那一段**就可以了。這段核心**執行次數的 n 的量級,就是整段要分析**的時間複雜度。

總的時間複雜度就等於量級最大的那段**的時間複雜度。那我們將這個規律抽象成公式就是:

如果 t1(n)=o(f(n)),t2(n)=o(g(n));那麼 t(n)=t1(n)+t2(n)=max(o(f(n)), o(g(n))) =o(max(f(n), g(n))).

*如果 t1(n)=o(f(n)),t2(n)=o(g(n));那麼 t(n)=t1(n)*t2(n)=o(f(n))*o(g(n))=o(f(n)g(n))

資料結構與演算法之美(二) 複雜度分析

資料結構和演算法解決的問題是 如何讓計算機更快時間 更省空間地工作 更快 更省的效能需要有東西來衡量,複雜度分析就是分別從執行時間和占用空間兩個維度來評估資料結構和演算法的效能 分別用時間複雜度和空間複雜度兩個概念來描述效能問題,二者統稱為複雜度。複雜度描述的是演算法執行時間 或占用空間 與資料規模...

資料結構與演算法之美 02複雜度分析(上)

如何分析 統計演算法的執行效率和資源消耗 複雜度描述的是演算法執行時間 或占用空間 與資料規模的增長關係。為什麼要需要複雜度分析?測試結果非常依賴測試環境,而且受資料規模影響很大,所以需要乙個不用具體資料來測試,可以粗略估計演算法的執行效率的方法 如何在不執行 的情況下,粗略的估算一段 的執行時間 ...

資料結構與演算法之美 2 複雜度分析(上)

相對於複雜度分析,還有乙個對立的分析方法,叫做事後統計法,但它有兩個缺點 測試結果非常依賴測試環境 測試結果受資料規模的影響很大 我們需要乙個不用具體的測試資料來測試,就可以粗略地估計演算法的執行效率的方法。這就是我們今天要講的時間 空間複雜度分析方法。對於大o複雜度表示法,我們可以把它總結成乙個公...