算法导论随笔(三): 分治策略与主方法Master Method

上一篇文章中介绍了分治策略和归并排序算法。这一篇中主要谈谈分治策略的复杂度计算公式,也就是主方法。我们知道,递归函数的表达式可以分为两部分,即递归部分和带有终止条件的结束部分。例如下面的公式,描述了归并排序复杂度的递归表达式。

注意:此篇文章较偏向于理论和数学计算,不过基本原理非常简单。不要被主方法中看似复杂的公式吓到,其本质只是初中数学。看到最后就会知道完全是自己吓自己。
在这里插入图片描述
上一篇文章中提到,分治策略的核心就是递归,因此,每一个使用分治策略的算法都应该有一个类似上图中的表达式来描述它的复杂度。这也是我接下来要写的重点。

主方法

对于分治策略算法来说,初始的问题被平均分为若干个小问题,对于每个小问题,都需要一定的时间来处理,并且在处理完之后进行合并。因此,对于分治策略算法,有一个通用的用于计算复杂度的表达式。或者说,大部分分治策略算法计算复杂度的表达式都是如下的形式:
在这里插入图片描述
其中,n为问题规模,也就是程序的输入规模。比如我们若想对一个长度为10的数组进行排序,则n=10。常数a表示递归的子问题的数量,而n/b表示每个子问题的规模。有些时候,a和b是相同
的,比如一个大问题被平均分成了4个小问题,而解决每个小问题的时间是解决大问题的时间的四分之一。这里a和b就都是4。当然也有很多a和b不同的情况,毕竟只有理想状态下a和b才会相同。公式中,a必须大于等于1,而b必须大于1,毕竟问题不可能越分解越大。

举个简单例子,一个公司要把一份业务分给四个人做,但每个人最后承担的工作量可能大于四分之一,毕竟每个人都要做一些互相重复的工作。
f(n)为递推以外进行的计算工作。比如归并排序中的合并步骤。
常数c表示递归终止时计算base case的工作量。比如归并排序中对叶子节点的排序。

主方法中对这个公式给出了三种case,代表着三种不同的情况。
下面给出主定理的定义(主方法依赖于主定理):
令a>=1和b>1是常数,f(n)是一个函数,T(n)是定义在非负整数上的递归式:
T ( n ) = a T ( n / b ) + f ( n ) T(n) = aT(n/b) + f(n) T(n)=aT(n/b)+f(n)
则T(n)有如下渐进界(可以直接理解为复杂度):
在这里插入图片描述

图中的三个case即代表着三种不同的情况。这三种情况基于a,b的值和f(n)的渐进上界。任意一个使用分治策略的算法的复杂度公式都会符合其中一种情况。接下来我就来解释这个公式的意思。

主方法公式解析及范例

在开始之前,让我们首先回顾一下算法复杂度计算(复杂度的本质是渐进界,因此其实这是计算渐进界的基本原则)时的一个基本原则,即当一个算法的复杂度是由一个多项式表示时,它的复杂度取决于最高次项的次数,而较低次项的次数都会被忽略。比如我们有一个算法,它的复杂度公式如下
T ( n ) = n 5 + n 4 T(n) = n^5 + n^4 T(n)=n5+

  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值