code

2016年11月5日 星期六

Algorithms筆記 2 - GCD /Fibonacci 說明演算法的差異很大

Fibonacci

Fibonacci本身就是一個recursion,所以學過遞回的人直覺上會寫成和數學式相符合的recursive program:


不過這個事實上重複計算了很多recursions!所以非常慢(正確的running time要用master theorem才能估計出)。

反而沒學過遞迴的人寫出的直覺iterative program可以在linear time (應該是asymptotically n^2 runtime) solve:


這個等於是用了額外的記憶體F array來換取縮短執行時間

最大公因數GCD

最大公因數如果很天真直覺地用for loop來測試1到a+b的話:


雖然是linear time algorithm,但是應該有更好的方法? (其實上面的for loop應該從a+b開始往下跑比較快)

要改良的方法是發現更多的數學上的關係(euclidean gcd lemma):


所以我們可以快速縮減每次input到gcd()的a,b值:


根據lemma寫成的program,是一個recursive program,執行時間相當於log(a*b),非常大的改進:


wow....是不是很有趣啊?!

沒有留言:

張貼留言