本篇文章涉及公式,因爲博客園沒有很好的支持,建議移步個人CSDN博客和簡書進行閱讀。java
咱們在解決算法問題時,常常會用到遞歸。遞歸在較難理解的同時,其算法的複雜度也不是很方便計算。而爲了較爲簡便地評估遞歸的算法複雜度,Master公式應運而生。下面給出Master公式的維基百科連接算法
$T(N) = a*T(\frac{N}{b}) + O(N^d)$數組
- a:子問題被調用的次數
- $\frac{N}{b}$:子問題的規模
- N:母問題的規模
- d:額外操做的次數
- 當$log_{b}a < d$時,$O(N^d)$;
- 當$log_{b}a > d$時,$O(N^{log_{b}a})$;
- 當$log_{b}a = d$時,$O(N^d*logN)$;
使用遞歸求最大值學習
代碼.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)$遞歸
使用Master公式分析遞歸問題複雜度時,各子問題的規模應該是一致的,不然不能使用Master公式。ip
本人系菜鳥一枚,所寫文章皆爲學習總結,大佬請輕噴😱
謝謝閱讀😘,歡迎補充!get