演算法複雜度分析 主定理

2021-07-24 05:46:56 字數 1575 閱讀 1568

規模為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個子問題,每個問題規模為n/bj,每個子問題運算量為c*(n/bj)^d需要完成的計算量為:

求和得到整個問題的運算量:

那麼,根據a與b^d的關係,很容易得到主定理。

應用二分搜尋

每次問題規模減半,a=1,b=2,d=0

複雜度為n^0 log(n) = log(n)。

快速排序

隨機選擇待排序序列中的乙個數字作為劃分字問題的標準,劃分是否平均影響演算法複雜度

每次問題規模減半,a=2,b=2,d=1

複雜度為n^2 log(n)

最差情況下,複雜度為o(n^2)

歸併排序

資料列均分為兩部分,分別排序,之後以o(n)的複雜度進行合併,空間複雜度o(n)

每次問題規模減半,a=2,b=2,d=1

複雜度為n log(n)

基數排序(radix sort)

對於待排序的整數序列,從最低位到最高位每次按照相應的位排序一次

每次遞迴問題規模變為原來的1/10,但需要求解10個子問題,額外運算為o(n)的,a=10,b=10,d=1

複雜度為n^1 log(n) = n log(n),近似為o(kn),k為整數的位數

快速傅利葉變換:fft

每次問題規模減半,a=2,b=2,d=1

複雜度為n log(n)

karatsuba快速乘法

正常兩個n位數乘法為n^2

演算法把兩個乘數各分為高低位兩部分,如x*y = (a+b) * (c+d) = ac+bd + (bc+ad) = ac+bd+(ac+bd - (a-b)(c-d))

只需要ac,bd,(a-b)(c-d)三次乘法

每次問題規模減半,但需要解3個子問題,加法是o(n)的,a=3,b=2,d=1

複雜度為n^log2(3)

ref:

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

標籤 演算法 複雜度分析 以下是評估遞迴時間複雜度的主定理,例如有遞迴形式 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 ...

主定理求解演算法時間複雜度

所謂主定理,就是用來解遞迴方程的一種方法,此方法可以用來求解大多數遞迴方程。設遞迴方程為t n at n b f n 其中a 1,b 1 主定理 1.如果存在常數 0有f n o n logb a 則t n n logb a 2.若f n n logb a 則t n n logb a logn2 n...

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

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