主定理
故事要从一道题说起[1]:
在解决这个问题之前,我们恐怕需要先了解一下什么是主定理.
问题的定义
上面我们分析了若干个程序的时间复杂度,不难发现,有递归的程序的复杂度不是那么容易分析.
形式化地讲,递归的函数会形如:
在上面的式子中,
从特殊情况讨论
为了说明这个问题,我们先考虑一种简单的情况,抹掉
首先思考,上面这个递归会进行多少层?
递归的核心思路就是:你希望解决一个大问题是吗?那就先解决一个小问题吧! 当问题已经被分解至答案显而易见时,递归就可以退出了. 形式化地讲,每次递归,我们都会将
其中
为什么要变换形式呢?第一个不伦不类,换成n这样多项式的形式就顺眼多了
这样看来,对于形如
主定理
递归将大问题拆成小问题,but at what cost? 拆分问题是有代价的——为了拆分问题我们需要
这就引入了主定理,主定理的内容如下[2]:
主定理
case1
如果存在
那么
case2
如果存在
那么
case3
如果存在
同时存在常数
那么
课程之外,菜狗存而不论,数学定理,菜狗论而不证.
我们先略过证明,简单解释一下上面的情况.
事实上,我们讨论的就是
更加复杂的是:如果
证明
未来再来探索吧
例子
接下来我们回到一开始的那几道题,来体会一下主定理的强大:
Problem 4 (a)
解
因为
Problem 4 (b)
解
因为
所以
而且在这里
Problem 4 (c)
解
因为
因为
Problem 4 (d)
解
因为
总结
- 我们可将一个递归的程序形式化地表示为
,表示每进行一次递归就将规模为 的问题拆解为 个规模为 的小问题,每次拆分的代价为 - 主定理给出了有上面形式的递归程序的时间复杂度的计算方法
- 使用主定理进行计算需要分析
的时间复杂度与 的大小关系