递归式就是一个等式或者不等式,它通过更小的输入上的函数值来描述一个函数。
那么如何求得递归算法的“O”和”Θ”渐进界呢?如果我们能够求解出递归式的”O”和”Θ”渐进界,我们就可以分析哪些问题使用递归算法是否合理。
求解递归式的三种方法:
- 1.代入法 : 自己猜测一个界,然后用数学归纳法进行验证是否正确
- 2.递归树法 :将递归式转换为一棵树,其结点表示不同层次的递归调用产生的代价。然后采用边界和技术来求解递归式。
- 3.主方法 :可求解形如下面公式的递归式的界:
T( n ) = aT( a/b ) + f(n)
其中a>=1,b>1,f(n)是一个给定的函数。这种形式的递归式很常见,它刻画了这样的一个问题:生成a个子问题,每个子问题的规模是元问题规模的1/b,分解和合并步骤总共花费时间为f(n)。
用代入法求解递归式
代入法求递归式分为两步:
- 1.猜测解的形式。
- 2.用数学归纳法求出解中的常数,并证明解释正确的。
当将归纳假设应用于较小的值时,我们将猜测的解带入函数,因此为”代入法“。这种方法使我们必须猜出解的形式。一般靠经验来猜。
一种方法是通过熟悉的递归式猜需要求解的递归式。
另外一种方法是先证明递归式较松的上界和下界,然后缩小不确定的范围。
用递归树方法求解递归式
递归树中,每个结点表示一个单一子问题的代价,子问题对应某次递归函数调用。我们将树中每层中的代价求和,得到每层代价,然后将所有层的代价求和,得到所有层次的递归调用的总代价。
用主方法求解递归式
主方法为如下形式的递归式提供一种“菜谱”式的求解方法:T( n ) = aT( a/b ) + f(n) , 其中a>=1,b>1,f(n)为渐进正函数。
描述的是这样的一种算法的运行时间:它将规模为n的问题分解为a个子问题,每个子问题规模为n/b,其中a和b都是正常数。a个子问题递归地进行求解,每个花费时间T(n/b)。函数f(n)包含了问题分解和子问题解合并的代价。