歡迎關注本人公衆號:Bean冷的心,內容包含計算機網絡、數據結構與算法、科技資訊和知識掃盲,期待結實各位大佬和對計算機感興趣的小夥伴~
看了左神的求遞歸算法時間複雜度分析受益頗多,在這裏寫一下收穫:
master公式的使用
T(N) = a*T(N/b) + O(N^d)
1) log(b,a) > d ->複雜度爲O(N^log(b,a))
2) log(b,a) = d ->複雜度爲O(N^d*logN)
3) log(b,a) < d ->複雜度爲O(N^d)
什麼意思呢?
a:迭代子算法有幾個
b:每個子算法負責多少數據
d:除去子過程剩下的時間複雜度的指數
看一個簡單的遞歸程序:
package com.bean.com.bean.sample;
public class EasyRecurrence {
//求數組中最大的元素
public static int getMax(int[] arr, int left, int right) {
if (left == right) {
return arr[left];
}
int mid = (left + right) / 2;
int leftMax = getMax(arr, left, mid);
int rightMax = getMax(arr, mid+1, right);
return Math.max(leftMax, rightMax);
}
public static void main(String[] args) {
int[] arr = {4,2,1,66,48};
System.out.println(getMax(arr,0,arr.length-1));
}
}
由於遞歸是將原本複雜的方法劃分爲很多小問題,所以這個小栗子程序的abd分別是什麼呢?
首先被求最大值這個問題被分成了兩部分,左半部分只求左半部分的最大值,右半部分只求右半部分的最大值,所以a = 2;每個子過程負責多大面積呢?假設總共N個數據的話,left只負責N/2,right也只負責N/2的數據,所以b = 2;除去迭代算法,時間複雜度就是O(1),也就是N的0次方,所以d = 0;
所以
T(N) = 2*T(n/2) + O(n^0)
套master公式:log以b爲底a的對數等於log2,也就是1,1是大於d=0的,所以執行第一個,時間複雜度爲:O(N^log(2,2))= O(N)
很簡單吧?
歡迎關注本人公衆號:Bean冷的心,內容包含計算機網絡、數據結構與算法、科技資訊和知識掃盲,期待結實各位大佬和對計算機感興趣的小夥伴~