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