【算法基礎】遞歸算法時間複雜度你真的懂嗎?master公式的使用。

~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;
所以 ,套用公式爲:

T(N) = 2*T(n/2) + O(n^0)

按照master公式分析複雜度的方法知 , 符合上述master公式的第一個分支 ,也就是求出的時間複雜度爲O(N^log(b,a)).
所以 ,求出此次分治法遞歸的時間複雜度爲:O(N^log(2,2))= O(N)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章