~Ooops:本片博客爲觀看嚴蔚敏第二版的數據結構書籍所做的總結性筆記,
有錯誤請望指出?
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:除去子過程剩下的時間複雜度的指數
例子
假設求出最大值的遞歸算法如下:
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);
}
分析代碼
易知代碼在一次遞歸過程中是將此次的問題分解爲如下:
[ leftMax ] [ rightMax ]
左邊最大值 右邊最大值
return Max(leftMax , rightMax )
遞歸是將原來的一個問題,劃分成不同複雜度的子問題 , 所以 ,複雜度就是 子問題複雜度的 n 倍, 加上他們之間和並的複雜度 。
套用公式分析
以上所指, 套用公式 ,知 a 代表 迭代子算法個數
, 知 求最大值 ,問題被分成左右兩個部分, 分別求出最大值 。所以 ,所以a = 2。
而b表示子算法所負責多少數據
,知,left只負責N/2,right也只負責N/2的數據,所以b = 2;
除去迭代算法,時間複雜度就是O(1),也就是N的0次方,所以d = 0;
所以 ,套用公式爲:
按照master公式分析複雜度的方法知 , 符合上述master公式的第一個分支 ,也就是求出的時間複雜度爲O(N^log(b,a))
.
所以 ,求出此次分治法遞歸的時間複雜度爲:O(N^log(2,2))= O(N)