第四章主要讲递归式(recurrence),递归式是一组等式或不等式,它所描述的函数是用在更小的输入下该函数的值来定义的。
本章提到三种方法来解递归式,分别是代入法,递归树方法,主方法。
1.代入法(Substitution method)
求解步骤:猜测解的形式;用数学归纳法求出解的常数,并证明解是正确的。
应用:用于确定一个递归式的上界或下界。
缺点:只能用于解的形式很容易猜的情形。
总结:这种方法需要经验的积累,可以通过转换为先前见过的类似递归式来求解。
2.递归树方法(Recursion-tree method)
当代入法很难得到一个正确的好的猜测值时可以使用。
应用:画出一个递归树是一种得到好猜测的直接方法。
分析:在递归树中,每一个结点都代表递归函数调用集合中一个子问题的代价。将递归树中每一层内的代价相加得到一个每层代价的集合,再将每层的代价相加得到递归式所有层次的总代价。
总结:递归树最适合用来产生好的猜测,然后用代入法加以验证。
递归树扩展过程:
3.主方法(Master method)
适用于形如T(n) = aT(n/b) + f(n)的递归式,但并不能解所有形如上式的递归式的解。
具体分析:T(n) = aT(n/b) + f(n)描述了将规模为n的问题划分为a个子问题的算法的运行时间,每个子问题的规模为n/b。
在这里可以看到,分治法就相当于a=2, b=2, f(n) = O(n).
主方法依赖于主定理,主定理如下图:
第五章围绕雇用问题展开,讲解了概率分析与随机算法。
问题提出:有一批参与面试的人,你要一个个面试(面试每个人都要花费c1),如果当前面试者比自己的助理能力强,则辞掉当前助理的,并把当前面试者提拔为助理(雇佣一个人要花费c2),直至面试完所有人。
这里考虑的是面试所需资金,假设总共有N人参加面试,有M人被雇佣过,则花费O(Nc1 + Mc2),因为参与面试的人员顺序是不确定的,所以要花费的资金也是不确定的(Nc1是确定的,而M是不确定的,所以Mc2是不确定的)。
1.概率分析
指在问题的分析中应用概率的技术。利用概率分析解决前面提到的问题:雇佣所需的花费与输入序列有关,有N个面试人员(考虑每个人的能力不一样),则一共有N!中排列情况(即每种排列出现的概率是1/(N!)),于是假设每种排列花费Ti元,则所有共花费:
T1/(N!) + T2/(N!) + … + TN/(N!)。
2.随机算法
如果一个算法的行为不只是由输入决定,同时也由随机数生成器所产生的数值决定,则这个算法是随机的。对于上面概率分析时的方法,虽然面试人员的排列是不确定的。但是如果当排列确定后,则所需花费也就确定了。而对于随机算法,就算排列确定,其花费也是不确定的。即随机发生在算法上,而不是发生在输入分布上。