? ? ? ?正如前文所說,我們把爬上N個臺階共有有多少種方法這一問題通過遞歸的方法得以了解決,但問題雖然解決了可我們想過這個程序的時空復雜度沒有?
? ? ? ? 首先,時間復雜度。它的時間復雜度是O(2^n),隨著樓梯臺階數的增長程序的運行時間呈指數增長。這是一種我們最不想看到的情況。再次,空間復雜度。由于采取函數的嵌套調用,程序運行所需空間也是相當大的。最后,那到底有沒有更好的優化方法呢?
? ? ? ?答案是肯定的!如果大家把該問題從頂而下的展開來,應該能發現它的所有求解函數F(X),X€{N,N-1,...,1}展開式是以完全二叉樹的形式組織起來的,且相鄰節點的左右子樹的值相同,這意味著在求解過程中存在重復的內容。
相同顏色的為重復的計算
? ? ? ? 所以我們可以通過一個哈希表存儲每一個求解函數的值,每當求解一個F(X)的時候先從哈希表中查看有無該函數值,如果有現成的值,則直接返回結果,如果沒有就計算該值并把結果存入哈希表中。
圖片發自簡書App
? ? ? ? 聽著好復雜哦,那還有沒有更簡單的辦法?答案也是肯定的!?。∧蔷褪?自底向上。那么何為自底向上?如果仔細觀察,我們會發現,F(3)的值只取決于F(1)和F(2),F(4)的值只取決于F(3)和F(2),...,F(N)的值只取決于F(N-1)和F(N-2)。好了有了這個結論,我們就可以"撿西瓜丟芝麻"了,而不是像哈希表一樣,存儲所有計算過的F(X),這樣是不是就大大大大減少了程序的空間復雜度?
圖片發自簡書App