演算法優化 遞迴演算法的優化策略

2021-10-25 01:57:45 字數 2161 閱讀 8475

在處理演算法問題時候,用的非常多的一種策略就是遞迴演算法了。但是遞迴演算法雖然簡單有效,但是該演算法的演算法效果總是有點差強人意。本文主要講述從兩個方向優化遞迴演算法,希望本文能給讀者一些thinking。(持續更新中…) 總結

示例:遞迴演算法我又把它稱為迭代演算法,因為大致思路都差不多(迭代:從已知推未知 遞迴:從未知回溯到已知,再推未知)。都是不斷地重複若干個較為簡單的問題,最終得到理想結果的一種演算法思路。(下文中並未嚴格區分遞迴和迭代)

首先先拿斐波那契數列來舉例說明(示例):

public int fibonacci(int n)
此時該演算法的公式為:f(n)=f(n-1)+f(n-2)+1,對應的時間複雜度為o(2^n)。具體可參考

而造成這演算法的時間複雜度如此之高的原因就是存在大量的冗餘計算。其中f(n)被計算1次,f(n-1)被計算一次,f(n-2)被計算兩次,times(f(n-3)) = times(f(n-1))+times(f(n-2))…

若想提公升這類演算法的效率的話,必不可少的就是減少這些冗餘計算。而想解決冗餘此時需要讀者想到「空間換時間、時間換空間」這個策略了。本演算法所借助的就是「空間換時間」策略。

**如下(示例):

public int fibonacci(int n) 

if(n==1 || n==2)

int ret = new int[n + 1];

ret[0] = 0;

ret[1] = 1;

for(int i = 2; i <= n; i++)

return ret[n];

}

本優化演算法就是採用空間換時間的思想解決斐波那契高冗餘計算。並且由times(f(n-2)) = times(f(n))+times(f(n-1))可知,越底層的計算,其迭代次數越高

主要思路:將高冗餘的屬性加入到乙個陣列中。用o(1)->o(n)的空間複雜度代價,換取時間複雜度從o(2^n)->o(n)

實現 pow(x, n) ,即計算 x 的 n 次冪函式。**示例:

public static double mypow(double x, int n) else

}public static double mypow2(double x, int n)

此時該演算法的公式為:f(n)=f(n-1)+1,對應的時間複雜度為o(n)。

此時該問題並不存在冗餘計算的問題,無法使用動態規劃思想。並且使用動態規劃解決問題的最小時間複雜度都需要o(n)。但是此時的時間複雜度已為o(n)。若優化則量級上只能將其優化為o(log n)或者o(log log n)。而若提到o(log n)的時間複雜度,則必須想到二分查詢演算法。本演算法的優化策略即由此展開的。

優化**如下(示例):

public double mypow(double x, int n)
本優化演算法採用二分策略跳過無用計算從而提公升效率。

主要思路:因為本題中f(n)不止和f(n-1)有直接關係,和f(n/2)、f(n/3)也有之間關係。因此針對這種問題可以採用二分策略提公升演算法效率。此時時間複雜度從o(n)->o(log n)

上文是針對迭代演算法的優化策略:動態規劃和「二分策略」。

動態規劃思想:動態規劃針對求解的問題可以劃分為一系列相互聯絡的階段, 在每個階段都需要作出決策,且乙個階段決策的選擇會影響下乙個階段的決策, 從而影響整個過程的活動路線, 求解的目標是選擇各個階段的決策使整個過程達到最優。

前提條件:但是使用動態規劃處理有一重要:「該問題需要滿足最優子結構」。

而迭代問題大都滿足此條件,因此若需要針對遞迴問題的優化策略。首推動態規劃。..

二分策略:在需要將演算法從o(n^2)->o(nlog n)或者從o(n)->o(log n)時候。此時一定要想到二分策略。而針對遞迴問題時候,可以思考f(n)是否和f(n/2)直接有關;若直接有關,那恭喜。二分策略一定能給你乙個滿意的優化方案。

演算法優化策略

下面是紫書上講的常用演算法設計策略和優化策略 拆分出的狀態必須滿足最優子結構性質和無後效性 當前階段以前的狀態不會影響以後的狀態,只與當前階段有關 動歸的目的是避免重疊子問題。遞推和遞迴 記憶化搜尋 是實現動歸的手段。只要滿足 1.狀態設計不重不漏 2.轉移方程正確 3.能順利統計答案,那麼這個dp...

遞迴演算法的優化

遞迴計算n 的階乘 param n return public long test long n else 優化計算 n 的階乘,尾遞迴 param n param result 1 return public long newtest long n,long result else 分析 上述 就...

遞迴演算法的優化

經群裡高人點撥。決定還是先把演算法優化下試試。遞迴演算法本身效率就比較低下,由於其便捷性,還有本人思維狹隘性,目前還無法想出替代它的方法。只能從遞迴內部的邏輯運算和變數等開始著手。先在各個過程裡加上計時器,看 耗時最大。例如 timer new stopwatch timer.start times...