遞歸算法時間複雜度分析(master公式使用)

歡迎關注本人公衆號: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冷的心,內容包含計算機網絡、數據結構與算法、科技資訊和知識掃盲,期待結實各位大佬和對計算機感興趣的小夥伴~

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