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