master 公式计算形如T(N) = a*T(N/b) + O(N^d)的复杂度

链接:https://www.nowcoder.com/questionTerminal/fe9be0ec96a14b39b2ec5c90fd7d554b?orderByHotValue=1&page=1&onlyReference=false
来源:牛客网
估计递归问题复杂度的通式,只要复杂度符合以下公式,都可以套用此公式计算时间复杂度

例子:递归方式查找数组最大值 T(N) = 2*T(N/2) + O(1)

T(N):样本量为 N 的情况下,时间复杂度
N:父问题的样本量
a:子问题发生的次数(父问题被拆分成了几个子问题,不需要考虑递归调用,只考虑单层的父子关系)
b:被拆成子问题,子问题的样本量(子问题所需要处理的样本量),比如 N 被拆分成两半,所以子问题样本量为 N/2
O(N^d):剩余操作的时间复杂度,除去调用子过程之外,剩下问题所需要的代价(常规操作则为 O(1))

    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)
    4. log(b,a)表示以b为底数,a为真数

以寻找第K大的Partition算法为例:

  单次Partition要找到比枢轴大(或小的数),而在最好情况下,每次将数组均分为长度相同的两半,运行时间 T(N) = N + T(N/2)

  d=1,a=1,b=2.

  log(b,a)=log(2,1)=0,小于d=1,因此复杂度为O(n^d)=O(N)

猜你喜欢

转载自www.cnblogs.com/lxy-xf/p/11375447.html