递归行为时间复杂度的估算

203 阅读1分钟

递归过程是不断压栈和出栈的过程,那该怎样估算它的时间复杂度呢,可以用到master公式

master公式的使用,需要递归过程可以写为:

T(N)= a * T(N/b) + O(N ^ d)

例如下面的求最大值的递归操作:

public static int getMax(int[] arr){
    return process(arr, 0, arr.length - 1);
}
public static int process(int[] arr, int L, int R){
    if(L == R){
        return arr[L];
    }
    int mid = L + ((R - L) >> 1);
    int leftMax = process(arr, L, mid);
    int rightMax = process(arr, mid + 1, R);
    return Math.max(leftMax, rightMax);
}

上面的写成master公式就是:T(N)= 2 * T(N/2)+ O(1),这个时候a = 2, b = 2, d = 0;

如果上面的代码块写成下面的形式:

public static int getMax(int[] arr){
    return process(arr, 0, arr.length - 1);
}
public static int process(int[] arr, int L, int R){
    if(L == R){
        return arr[L];
    }
    for(int i = L; i <= R; i++){
        System.out.println(arr[i]);
    }
    int mid = L + ((R - L) >> 1);
    int leftMax = process(arr, L, mid);
    int rightMax = process(arr, mid + 1, R);
    return Math.max(leftMax, rightMax);
}

这时上面代码块的master公式需要改写成:T(N)= 2 * T(N/2)+ O(N)

针对可以写成master公式的递归过程,它们的时间复杂度可以由下面推出:

  1. log(b,a) > d时,时间复杂度是O(N ^ log(b,a))
  2. log(b,a) = d时,时间复杂度是O((N^d) * log(N))
  3. log(b,a) < d时,时间复杂度是O(N^d)