演算法時間複雜度之分治與遞迴
演算法是解決問題的辦法或法則,而「速度」就是演算法之魂,在計算機中所謂的「速度」就是=時間+空間。在大家初期的演算法學習中,往往感覺演算法這東西摸不著頭腦,會感覺:它為什麼會這麼用,這種用法究竟有什麼不同,我自己的解法就不好嗎?所以要想解決這種困惑,要想真正的理解演算法之道,就必須要對演算法的複雜度進行分析。
因為演算法的複雜度與時間效率有很大的關係,所以我們分析演算法往往基於對時間複雜度的分析。
今天這一節,我們先講講遞迴問題的演算法分析。
演算法核心:一般來講,分治策略將乙個大的複雜的問題劃分為a個同樣的子問題,這些子問題的大小為n/b。如果一直遞迴分解下去,我們獲得的演算法時間複雜性的遞迴表示式為:
tn=a+t(n/b)+f(n)
這裡的b是每次分解時間問題規模減小的因子,a是每次分解時產生的子問題個數,是分解出(和合併)a個大小為n/b的子問題的成本。很顯然,a>=1,b>1,並且f的漸進趨勢為正。(如果該函式漸進表現為負會是什麼情況?)注意,如果b<=1,則說明這種分治完全失敗,因為分解出來的子問題規模與原問題相當或超過了原問題!
這樣,求解乙個分而治之演算法的時間效率就是求解上述遞迴表示式。那麼上述遞迴表示式的解是什麼呢?
eg:有一段程式:
voidfun(int a,int n,int k)
else
} 因為每次分解只有乙個fun()函式,所以a=1;
因為每次k只加1,所以n/b=(n-1)/1;
因為每次分解都有乙個i從k到n的迴圈,所以f(n)=n-k;
綜上:
n ,當k=n-1;
t(n)=
(n-k)+t(k+1) ,其他情況;
所以大家基於這個求遞迴的複雜度的演算法,可以進一步檢驗此類演算法的效率。
時間複雜度與空間複雜度,遞迴演算法
lina acm 演算法複雜度分為時間複雜度和空間複雜度。下面摘錄其含義 時間複雜度是指執行演算法所需要的計算工作量。重點在其計算方法 乙個演算法中的語句執行次數稱為語句頻度或時間頻度。記為t n 一般情況下,演算法的基本操作重複執行的次數是模組n的某乙個函式f n 因此,演算法的時間複雜度記做 t...
遞迴演算法時間複雜度
開篇前言 為什麼寫這篇文章?筆者目前在學習各種各樣的演算法,在這個過程中,頻繁地碰到到遞迴思想和分治思想,驚訝於這兩種的思想的偉大與奇妙的同時,經常要面對的乙個問題就是,對於乙個給定的遞迴演算法或者用分治思想縮小問題規模的演算法,如何求解這個演算法的時間複雜度呢?在google過很多的博文後,感覺這...
遞迴演算法時間複雜度
求遞迴演算法時間複雜度 遞迴樹 遞迴演算法時間複雜度的計算方程式乙個遞迴方程 在引入遞迴樹之前可以考慮乙個例子 t n 2t n 2 n2迭代2 次可以得 t n n2 2 2t n 4 n 2 2 還可以繼續迭代,將其完全展開可得 t n n2 2 n 2 2 2 n 22 2 2 n 23 2 ...