Master公式:分析递归函数的时间复杂度

形如 T ( N ) = a × T ( N / b ) + O ( N d ) T(N) = a \times T(N/b) + O(N^d) T(N)=a×T(N/b)+O(Nd) (其中的 a 、 b 、 d a、b、d abd 都是常数)的递归函数,可以直接通过Master公式来确定时间复杂度

  • 如果 l o g ( b , a ) < d log(b,a) < d log(b,a)<d,复杂度为 O ( N d ) O(N^d) O(Nd) ( l o g ( b , a ) 表 示 以 b 为 底 , 即 l o g b a log(b,a)表示以b为底,即log_ba log(b,a)blogba)

  • 如果 l o g ( b , a ) > d log(b,a) > d log(b,a)>d,复杂度为 O ( N l o g ( b , a ) ) O(N^{log(b,a)}) O(Nlog(b,a))

  • 如果 l o g ( b , a ) = = d log(b,a) ==d log(b,a)==d,复杂度为 O ( N d × l o g N ) O(N^d \times logN) O(Nd×logN)

只有子问题的规模都一样的递归才能用Master公式估计时间复杂度

例如 求arr数组的最大值,使用递归求解:

int process(vector<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 max(leftMax, rightMax);
}

int getMax(vector<int> &arr) {
    return process(arr, 0, arr.size() - 1);
}

该递归的Master公式: T ( N ) = 2 × T ( N / 2 ) + O ( 1 ) T(N) = 2 \times T(N/2) + O(1) T(N)=2×T(N/2)+O(1)

其中:大递归的数据量为 N N N,所以左侧写 T ( N ) T(N) T(N);子过程的数据量为 N / 2 N/2 N/2,所以为 T ( N / 2 ) T(N/2) T(N/2),而子过程执行了2次,所以乘以2;除了递归以外所有行为的复杂度为 O ( 1 ) O(1) O(1)。其中 a = 2 a = 2 a=2 b = 2 b = 2 b=2 d = 0 d = 0 d=0,根据Master公式,所以复杂度为 O ( N ) O(N) O(N)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值