算法设计与分析包括:算法的描述,算法的设计技术,算法的正确性证明,算法的时空复杂度(最坏,平均,最好)
有些问题已经得到证明有复杂度下界:如排序算法为 O(nlogn) .
有些问题还未给出多项式算法,只会蛮力(brutal force)的指数算法,如哈密顿回路。它们属于NP完全问题,21世纪数学界最重要的问题之一。
简单的数学基础
阶乘函数 O(n!)=O(nlogn) . 在数据结构与算法课上已经学过,由stirling公式 n!=2πn‾‾‾‾√(ne)n 可以推得
调和级数 ∑nk=11k=lnn+O(1) .这是微积分中熟知的结论。
附上书上精彩的积分证明. 作图 y=lnx 即可.矩形面积之和.
∑nk=11k>∫n+11dxx=ln(n+1).
∑nk=11k<1+∫n1dxx=1+lnn.
由夹逼原理,得证.
递推方程的求解方法
我认为这是本章的难点。简单的递推方程,形如: T(n)=2T(n−1)+1 ,(Hanoi塔时间复杂度)是高中数列题,作变形 T(n)+1=2(T(n−1)+1) ,等比数列即可。但处理 T(n)=2T(n/2)+n−1 ,(二分归并排序算法)高中数学好像不管用了,而这个方程属于形式 T(n)=aT(n/b)+f(n) ,是递归函数的常见形式,可以通过递归树或主定理解决。值得注意的是,不同于数学学科需要求出精确值,计算机科学只需要求出复杂度的上下界,故方法比较容易。
1. 递归树
e.g.
T(n)=T(n/3)+T(2n/3)+n
作出如上的递归树。第一层为
f(n)
(常数项),第二层原本为
T(n/3)&T(2n/3)
,保持该递推等式,然后考虑第二层分裂,于是第二层变为
f(n/3)&f(2n/3)
,以此类推,会发现子树高度不对称,比例因子
1/3,2/3
使得右子树趋于0的速度最慢。故最坏情况下层数k满足
(23)kn=1
,即
k=log3/2n
. 注意带权结点之和为
T(n)
,我们可以通过先每层求和,再求总和计算。发现每层之和均为n,层数为k,故
T(n)=k∗n=O(nlogn)
.
2. 主定理 MasterTheorem
这里就不叙述证明了,值得提醒,主定理并非适用所有该形式的递推方程。