遞歸算法時間復雜度分析(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冷的心,內容包含計算機網絡、數據結構與算法、科技資訊和知識掃盲,期待結實各位大佬和對計算機感興趣的小伙伴~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM