数据结构与算法学习(二)——Master公式及其应用

1. Master公式是什么?

我们在解决算法问题时,经常会用到递归。递归在较难理解的同时,其算法的复杂度也不是很方便计算。而为了较为简便地评估递归的算法复杂度,Master公式应运而生。下面给出Master公式的维基百科链接

1.1 Master公式

  • a:子问题被调用的次数
  • :子问题的规模
  • N:母问题的规模
  • d:额外操作的次数
  1. 当时,;
  2. 当时,;
  3. 当时,;

2. Master公式的应用举例

使用递归求最大值

  • 代码

    public static int maxNum(int[] arr, int L, int R){
        if(L == R) {
            return arr[L];
        }
        int mid = L + ((R - L) >> 1);
        int lMax = maxNum(arr, L, mid);
        int rMax = maxNum(arr, mid + 1, R);
        return Math.max(lMax, rMax);
    }
    
  • 解析:如上是求数组中的最大值的方法,将数组划分成左半部和右半部,求出左边最大值,在求出右边的最大值,最后比较左右的最大值,求出整个数组的最大值。因为将数组划分为左右两部分,所以子问题的规模为,即b = 2,又有int lMax = maxNum(arr, L, mid)int rMax = maxNum(arr, mid + 1, R)的两次调用,所以a = 2,剩下来,有return arr[L]int mid = L + ((R - L) >> 1)return Math.max(lMax, rMax)三个常数级的操作,所以d = 0。

    将a,b,d代入,则其Master公式可表示为:

    根据Master公式,,所以,复杂度为

3. 注意事项

使用Master公式分析递归问题复杂度时,各子问题的规模应该是一致的,否则不能使用Master公式。

本人系菜鸟一枚,所写文章皆为学习总结,大佬请轻喷
谢谢阅读,欢迎补充!

你可能感兴趣的:(数据结构与算法学习(二)——Master公式及其应用)