数据结构与算法 —— master公式的使用

定义

T(N) = a * T(N/b) + O(N^d)
a:子规模问题调用的次数
1/b:子规模问题的规模(子问题等规模)
O(N^d):子规模问题之外的时间复杂度

用法

满足master公式的算法,可通过其系数 估算时间复杂度:
log(b,a) > d,时间复杂度为O(N^log(b,a)),
log(b,a) = d,时间复杂度为O(N^d * logN),
log(b,a) < d,时间复杂度为O(N^d)

用例

    /**基础二分法求最大值 */
    process(arr:number[],l:number,r:number):number{
        if(l==r){
            return arr[l];
        }
        let mid = l + ((r-l)>>1);  //防溢出的求中点方式,万一数组很大的情况下
        let lMax = this.process(arr,l,mid);
        let rMax = this.process(arr,mid + 1,r);
        return lMax > rMax ? lMax : rMax;
    }

上方代码中 子问题规模为1/2,所以b=2,子规模调用次数为两次,所以a=2,除了子问题以外的其余部分复杂度为O(1),所以d=0

log(2,2) > 0,因此该算法的时间复杂度为O(N),说明二分递归求最大值算法 和遍历一遍的时间复杂度一致

注意:

子问题每次的规模相等才满足master,用例是从数组的1/2处拆分做递归,子问题规模都是1/2。如果从一个数组的1/3处拆分为两部分,其中一次调用的规模为1/3,另一次为2/3,则其不满足master公式。若将该数组拆分为等量三部分,3次递归的规模都为1/3,也满足master公式。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值