Master公式計算遞歸時間復雜度
我們在算遞歸算法的時間復雜度時,Master定理為我們提供了很強大的便利!
Master公式在我們的面試編程算法中除了BFPRT算法的復雜度計算不了之外,其他都可以準確計算!
這裏用求數組最大值的遞歸函數來舉例:
public static int getMax(int[] arr, int L, int R) { if (L == R) { return arr[L]; } int mid = (L + R) / 2; int maxLeft = getMax(arr, L, mid);int maxRight = getMax(arr, mid + 1, R); return Math.max(maxLeft, maxRight); }
master公式:也叫主定理。它提供了一種通過漸近符號表示遞推關系式的方法。
應用Master定理可以很簡便的求解遞歸方程。
T [n] = a*T[n/b] + O (N^d)
①當d<log(b,a)時,時間復雜度為O(n^(logb a))
②當d=log(b,a)時,時間復雜度為O((n^d)*logn)
③當d>log(b,a)時,時間復雜度為O(n^d)
將整個數組分為兩部分,則左部分為n/2,右部分也為n/2,兩者相加,返回操作為O(1)
則得到的式子如下:
T [n] = 2*T[n/2] + O (1)
a=2,b=2,d=0
d<log(b,a)則時間復雜度為O(n)
說明:
遞歸 就是系統幫自己做 壓棧和出棧的過程
分析那個例子:
1 max(arr,0,3) ,開始執行 ,mid=1,然後到 max(arr,0,1)
2 遇到自己的方法max之後,就把當前的狀態進行壓棧,狀態包括 方法調用到第幾行,以及過程中的變量,如mid=1,left=0,right=3
3 max(arr,0,1)開始執行,mid=0,然後到max(arr,0,0)
4 遇到自己的方法max之後,就把當前的狀態壓棧,狀態包括 方法調用到第幾行,以及過程中的變量,如mid=0,left=0,right=1
5 max(arr,0,0)開始執行,此時left==right,返回值。
6 返回的值如何知道返回給哪個函數呢?此時把 棧頂的信息拿出,還原以前的狀態,此時棧頂為max(arr,0,1),運行到
int maxLeft = getMax(arr,L,mid) 這一行,那麽返回的值就賦給maxLeft
7 返回之後,函數繼續運行,到了int maxRight = getMax(arr,mid+1,R); 此時再把當前的狀態壓棧,max(arr,0,1) ,行號,maxLeft等
8 同樣的方法 把值返回給maxRight,最後返回最大值。如果棧中還有元素,繼續出棧,然後賦值,知道最後棧中沒有元素。
Master公式計算遞歸時間復雜度