寫在前面:博主是一位普普通通的19屆雙非軟工在讀生,平時最大的愛好就是聽聽歌,逛逛b站。博主很喜歡的一句話花開堪折直須折,莫待無花空折枝
:博主的理解是頭一次為人,就應該做自己想做的事,做自己不後悔的事,做自己以後不會留有遺憾的事,做自己覺得有意義的事,不浪費這大好的青春年華。博主寫部落格目的是記錄所學到的知識並方便自己複習,在記錄知識的同時獲得部分瀏覽量,得到更多人的認可,滿足小小的成就感,同時在寫部落格的途中結交更多志同道合的朋友,讓自己在技術的路上並不孤單。
目錄:1.斐波那契遞迴**實現
2.斐波那契的時間複雜度的詳細分析
3.斐波那契的空間複雜度詳細分析
int
fibonacci
(int n)
我們來看乙個當n=5的時候遞迴**如何執行的(沒完全展開):
二叉樹的高度是 n - 1,由我們的基礎知識可以知道,乙個高度為k的二叉樹最多可以由 2k- 1個葉子節點,也就是遞迴過程函式呼叫的次數,所以時間複雜度是:
o(2n)當然這只是針對斐波那契數列,漢諾塔等等,如果是其他的遞迴可能又會不同。當然當**的時間複雜度為指數級的時候,隨著引數的變大,程式的效率是非常低下的,而且當n值過大,容易產生棧溢位的可能,明顯這樣的遞迴方法是低效的。
還拿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)
斐波那契數列時間複雜度
1.時間複雜度 o 2 n 空間複雜度 o n def fib n if n 3 return 1return f n 1 f n 2 推導 時間複雜度 f n f n 1 f n 2 每一層都包含乙個加法操作 例如n 8時,t n 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 1...
斐波那契數與時間複雜度
斐波那契數列 經典數學問題之一 斐波那契數列,又稱 分割數列,指的是這樣乙個數列 1 1 2 3 5 8 13 21 第一項,第二項的值為1,第三項開始,它的值為前兩項之和。實現非常簡單 簡單的看看這個圖,分析一下,根據fab 1 n 1 fab 1 n 2 如果想要得到斐波那契其數的第五項,首先要...
複雜度分析 時間複雜度 空間複雜度
執行效率是演算法的乙個重要的考量指標,演算法的執行效率用時間 空間複雜度來衡量。今天我們來學習一下複雜度的分析。通常我們可以通過執行程式來獲得演算法的真正的執行時間,這種方法我們可以稱為事後統計法,但這種方法得到的是具體的資料,測試結果很依賴測試環境,而且受資料規模影像最大。因此,我們需要乙個不需要...