1. 程式人生 > >Master公式計算遞歸時間復雜度

Master公式計算遞歸時間復雜度

turn 包括 就是 過程 變量 個數 開始 狀態 left

我們在算遞歸算法的時間復雜度時,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)

以getMax來說明

將整個數組分為兩部分,則左部分為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公式計算遞歸時間復雜度