遞迴時間複雜度分析 主定理分析

2022-08-29 20:48:23 字數 1188 閱讀 8383

標籤: 演算法 複雜度分析

以下是評估遞迴時間複雜度的主定理,例如有遞迴形式

\[t(n) = at(n/b) + f(n)

\]其中, \(a≥1\)和\(b≥1\), 均為常數, \(f(n)\)是乙個確定的正函式。 在\(f(n)\)的三類情況下, 我們有\(t(n)\)的漸近估計式:

若對於某常數\(ε>0\), 有\(f(n) = o(n ^ )\), 則\(t(n) = \theta(n ^ )\)

若\(f(n) = o(n ^ )\), 則\(t(n) = o(n ^ *lgn)\)

若對某常數\(ε>0\), 有\(f(n)=\omega(n ^)\), 且對常數\(c<1\) 與所有足夠大的\(n\),有\(af(n/b)\le cf(n)\), 則\(t(n)=\theta(f(n))\)。

主定理可以理解為:

情況1, 若\(f(n) \lt n ^ \), 則複雜度為 $t(n)=\theta(n ^ ) \(;

情況2, 若\)f(n) = n ^ $, 則複雜度為 $t(n)=\theta(n ^ * lg n) \(;

情況3, 若\)f(n) \gt n ^ $, 則複雜度為 $t(n)=\theta(f(n)) $。

(1)求\(t(n) = 9t(n/3) + n\)

其中\(a = 9\), \(b = 3\), \(f(n) = n\), 代入求解得 \(n ^ = n ^ 2\), 由於\(f(n) < n ^ 2\), 情況1成立,\(t(n) = \theta(n ^ 2)\)

(2)求\(t(n) = t(2n/3) + 1\)

其中\(a = 1\), \(b = 3/2\), \(f(n) = 1\), 代入求解得 \(n ^ 1} = n ^ 0 = 1\), 由於\(f(n) = 1\), 情況2成立,\(t(n) = \theta(lg n)\)

(3)歸併排序的複雜度分析

(二路)歸併排序屬於分治法,本質是先把陣列分成兩半,再做合併操作,其中合併操作複雜度為常數\(c\),則可以看作

\[t(n) = 2t(n / 2) + c

\]其中\(a=2\), \(b = 2\),$ f(n) = c\(, 則根據主定理分析,\)n^ = n ^ 1 = 1 $, 屬於情況2, 則歸併排序的複雜度為

\[t(n) = \theta(n *lg n)

\]

演算法複雜度分析 主定理

規模為n的問題通過分治,得到a個規模為n b的問題,每次遞迴帶來的額外計算為c n d t n at n b c n d 那麼就可以得到問題的複雜度為 可見,每次遞迴把問題分為a個規模為n b的子問題。從根節點開始,共有logb n 1層,葉子節點數為a logb n 那麼,第j層共有aj個子問題,...

演算法分析 快速排序 主定理分析遞迴的複雜度

快速排序對於初學者而言算是實現較為困難的一種排序方法,而其 的實現方法也有多種,本文採用其中一種方法實現快排,並採用主定理對其複雜度進行分析。對於乙個已經排序好的陣列,一定有該特性 任取乙個數字,其左邊的數字 若存在 全部小於該數字,其右邊的數字 若存在 一定大於該數字。那麼我們便可以對乙個未排序陣...

主定理與時間複雜度

只好在網上找了一篇看起來不怎麼嚴謹的部落格,不過算出來的是對的?那就預設是對的吧qwq 如果我們要解決規模為 n 的問題,通過分治,得到 a 個規模為 frac 的問題,每次的額外複雜度為 o n d t n at frac c n d begin t left n right begino lef...