演算法學習中,常常需要用到遞迴函式,對於部分滿足公式t(n)=a*t(n/b)+o(nd)的演算法,其時間複雜度如下:
當logba>d,o(t(n))=o(nlogba)
當logbad)
當logba==d,o(t(n))=o(nd*logn)
公式t(n)=a*t(n/b)+o(nd)中,n指問題的規模,a、b、d皆為常數。其中,n/b是子問題的規模,a為子問題的個數,o(nd)為一層迴圈中,除去子問題的其它**的時間複雜度。
注意,並不是所有遞迴都滿足上面的公式。要想確認是否滿足,首先需要子問題的規模n/d是等量小的(可以偏差少數幾個)。且若要套用上面的公式,需要在一層迴圈中去看,不要再考慮遞迴子函式中是怎麼實現的。
遞迴求解陣列的最大值
public
void
findmax
(int
arr)
private
intprocess
(int
arr,
int left,
int right)
int mid=left+
((right-left)
>>1)
;int leftmax=
proccess
(arr,left,mid)
;int rightmax=
process
(arr,mid+
1,right)
;return math.
max(leftmax,rightmax)
;}
套用上面的公式t(n)=a*t(n/b)+o(nd),子問題的規模n/b=n/2,子問題的個數a=2,一層迴圈中,除去子問題,其他**的複雜度為o(1),即d=0。
logba=log22=1 > d=0,滿足結論中的第1種情況,所以整個演算法的時間複雜度為o(nlogba)=o(n)
演算法學習 演算法的時間複雜度與空間複雜度
乙個演算法執行所耗費的時間,從理論上來說是不能計算出來的,必須通過上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數多,它花費時間就多。...
演算法學習筆記之時間複雜度的學習
1 時間複雜度時間複雜度表示演算法的執行時間與資料規模之間的增長關係 2 空間複雜度空間複雜度表示演算法的儲存空間與資料規模之間的增長關係 1 常見的時間複雜度常見的時間複雜度度量級 常量階 o 1 對數階 o logn 線性階 o n 線性對數階 o nlogn 平方階 o n n 立方階 o n...
遞迴演算法時間複雜度
開篇前言 為什麼寫這篇文章?筆者目前在學習各種各樣的演算法,在這個過程中,頻繁地碰到到遞迴思想和分治思想,驚訝於這兩種的思想的偉大與奇妙的同時,經常要面對的乙個問題就是,對於乙個給定的遞迴演算法或者用分治思想縮小問題規模的演算法,如何求解這個演算法的時間複雜度呢?在google過很多的博文後,感覺這...