递归

递归行为本质上就是基于系统栈的,所有的递归都可以改为迭代。有如下代码,寻找数组 arr[L, R]范围内的最大值,使用递归完成:

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(lefMax, rightMax);
}

每执行一次就压入系统栈,每次执行结束出栈,如此循环。

image-20220109161126709

master公式

Master公式是用来解决递归问题时间复杂度的公式。记录主方法的表现形式:

上述排序arr的代码符合master公式,他的时间复杂度公式为:

如果递归满足Master公式,那么时间复杂度为:

  1. 如果logbA > d,那么时间复杂度为 O(N^(logbA))

  2. 如果logbA < d,那么时间复杂度为 O(N^d)

  3. 如果logbA==d,那么时间复杂度为O(N^d * logN)

这里 a = 2b = 2d = 0,其 logbA = 1 ,所以 logbA > d,故上述代码的时间复杂度为 O(N^(logbA)),即O(N)

最后更新于

这有帮助吗?