數據結構與算法學習(二)——Master公式及其應用

本篇文章涉及公式,因爲博客園沒有很好的支持,建議移步個人CSDN博客和簡書進行閱讀。java

1. Master公式是什麼?

咱們在解決算法問題時,常常會用到遞歸。遞歸在較難理解的同時,其算法的複雜度也不是很方便計算。而爲了較爲簡便地評估遞歸的算法複雜度,Master公式應運而生。下面給出Master公式的維基百科連接算法

1.1 Master公式

$T(N) = a*T(\frac{N}{b}) + O(N^d)$數組

  • a:子問題被調用的次數
  • $\frac{N}{b}$:子問題的規模
  • N:母問題的規模
  • d:額外操做的次數
  1. 當$log_{b}a < d$時,$O(N^d)$;
  2. 當$log_{b}a > d$時,$O(N^{log_{b}a})$;
  3. 當$log_{b}a = d$時,$O(N^d*logN)$;

2. Master公式的應用舉例

使用遞歸求最大值學習

  • 代碼.net

    public static int maxNum(int[] arr, int L, int R){
        if(L == R) {
            return arr[L];
        }
        int mid = L + ((R - L) >> 1);
        int lMax = maxNum(arr, L, mid);
        int rMax = maxNum(arr, mid + 1, R);
        return Math.max(lMax, rMax);
    }
  • 解析:如上是求數組中的最大值的方法,將數組劃分紅左半部和右半部,求出左邊最大值,在求出右邊的最大值,最後比較左右的最大值,求出整個數組的最大值。由於將數組劃分爲左右兩部分,因此子問題的規模爲$\frac{N}{2}$,即b = 2,又有int lMax = maxNum(arr, L, mid)int rMax = maxNum(arr, mid + 1, R)的兩次調用,因此a = 2,剩下來,有return arr[L]int mid = L + ((R - L) >> 1)return Math.max(lMax, rMax)三個常數級的操做,因此d = 0。code

    將a,b,d代入,則其Master公式可表示爲:$T(N) = 2 * T(\frac{N}{2}) + O( 1 )$blog

    根據Master公式,$log_b{a} = log_2{2} = 1 > d = 0$,因此,複雜度爲$O(N^{log_ba}) = O(N)$遞歸

3. 注意事項

使用Master公式分析遞歸問題複雜度時,各子問題的規模應該是一致的,不然不能使用Master公式。ip

本人系菜鳥一枚,所寫文章皆爲學習總結,大佬請輕噴😱
謝謝閱讀😘,歡迎補充!get

相關文章
相關標籤/搜索