递归时间/空间复杂度的分析(斐波那契为例)
寫在前面:博主是一位普普通通的19屆雙非軟工在讀生,平時最大的愛好就是聽聽歌,逛逛B站。博主很喜歡的一句話花開堪折直須折,莫待無花空折枝:博主的理解是頭一次為人,就應(yīng)該做自己想做的事,做自己不后悔的事,做自己以后不會留有遺憾的事,做自己覺得有意義的事,不浪費這大好的青春年華。博主寫博客目的是記錄所學(xué)到的知識并方便自己復(fù)習(xí),在記錄知識的同時獲得部分瀏覽量,得到更多人的認(rèn)可,滿足小小的成就感,同時在寫博客的途中結(jié)交更多志同道合的朋友,讓自己在技術(shù)的路上并不孤單。
目錄:
1.斐波那契遞歸代碼實現(xiàn)
2.斐波那契的時間復(fù)雜度的詳細(xì)分析
3.斐波那契的空間復(fù)雜度詳細(xì)分析
1.斐波那契遞歸代碼實現(xiàn)
int Fibonacci(int n) {if(n==1||n==2)return 1;elsereturn Fibonacci(n-1)+Fibonacci(n-2); }2.斐波那契的時間復(fù)雜度的詳細(xì)分析
我們來看一個當(dāng)n=5的時候遞歸代碼如何執(zhí)行的(沒完全展開):
二叉樹的高度是 n - 1,由我們的基礎(chǔ)知識可以知道,一個高度為k的二叉樹最多可以由 2k- 1個葉子節(jié)點,也就是遞歸過程函數(shù)調(diào)用的次數(shù),所以時間復(fù)雜度是:
O(2n)
當(dāng)然這只是針對斐波那契數(shù)列,漢諾塔等等,如果是其他的遞歸可能又會不同。當(dāng)然當(dāng)代碼的時間復(fù)雜度為指數(shù)級的時候,隨著參數(shù)的變大,程序的效率是非常低下的,而且當(dāng)n值過大,容易產(chǎn)生棧溢出的可能,明顯這樣的遞歸方法是低效的。
3.斐波那契的空間復(fù)雜度詳細(xì)分析
還拿n==5來說
①-③:調(diào)用Fib(5),首先需調(diào)用Fib(4),Fib(4)要先調(diào)用Fib(3),逐步調(diào)用直至返回Fib(2)的值1,Fib執(zhí)行結(jié)束,所創(chuàng)建空間銷毀。此時Fib(5)、Fib(4)、Fib(3)均未調(diào)用結(jié)束,程序共占用4個函數(shù)棧幀空間。
④-⑨:Fib(2)執(zhí)行結(jié)束,接下來調(diào)用Fib(1),創(chuàng)建一個函數(shù)棧幀空間,調(diào)用結(jié)束返回1后,該空間銷毀,此時可得到Fib(3)=2,通過第⑦步返回Fib(3)的值,第⑧步同樣創(chuàng)建空間再次調(diào)用Fib(2),調(diào)用結(jié)束銷毀空間,此時可得到Fib(4)=3,通過第⑨步返回Fib(4)的值,此過程最大占用4個函數(shù)棧幀空間。
⑩-···:最后和上面一樣,調(diào)用Fib(3),將返回值傳給Fib(5)的模塊,最終得到Fib(5)=5。
整個程序執(zhí)行過程中,最多占用4個函數(shù)棧幀空間的大小,4就是整個二叉樹的深度,而其樹的深度有是n-1
所以:
斐波那契的空間復(fù)雜度就是樹的深度 S(n)
總結(jié)
以上是生活随笔為你收集整理的递归时间/空间复杂度的分析(斐波那契为例)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用循环链表解决约瑟夫环问题
- 下一篇: 顺序循环队列队满队空的两种判别方式