分治法时间复杂度求解:主定理、代换法和递归树

分治策略:

分解:将原问题划分成形式相同的子问题,规模可以不等,对半或2/3对1/3的划分。

解决:对于子问题的解决,很明显,采用的是递归求解的方式,如果子问题足够小了,就停止递归,直接求解。

合并:将子问题的解合并成原问题的解。

这里引出了一个如何求解子问题的问题,显然是采用递归调用栈的方式。因此,递归式与分治法是紧密相连的,使用递归式可以很自然地刻画分治法的运行时间。所以,如果你要问我分治与递归的关系,我会这样回答:分治依托于递归,分治是一种思想,而递归是一种手段,递归式可以刻画分治算法的时间复杂度。所以就引入本文的重点:如何解递归式?

解递归式的三种方法:主定理、递归树和代换法

主定理:
分治法时间复杂度求解:主定理、代换法和递归树_第1张图片分治法时间复杂度求解:主定理、代换法和递归树_第2张图片
扩展:算法导论练习4.6-2简化版:
分治法时间复杂度求解:主定理、代换法和递归树_第3张图片

递归树法:

起因:代换法有时很难得到一个正确的好的猜测值。
用途:画出一个递归树是一种得到好猜测的直接方法。
分析(重点):在递归树中,每一个结点都代表递归函数调用集合中一个子问题的代价。将递归树中每一层内的代价相加得到一个每层代价的集合,再将每层的代价相加得到递归式所有层次的总代价。
总结:递归树最适合用来产生好的猜测,然后用代换法加以验证。
递归树的方法非常直观,总的代价就是把所有层次的代价相加起来得到。但是分析这个总代价的规模却不是件很容易的事情,有时需要用到很多数学的知识。

例子:快排9:1划分(算法导论)
分治法时间复杂度求解:主定理、代换法和递归树_第4张图片分治法时间复杂度求解:主定理、代换法和递归树_第5张图片
代换法:

定义:先猜测某个界的存在,再用数学归纳法去证明该猜测的正确性。
缺点:只能用于解的形式很容易猜的情形。
总结:这种方法需要经验的积累,可以通过转换为先前见过的类似递归式来求解。

例子:
分治法时间复杂度求解:主定理、代换法和递归树_第6张图片

你可能感兴趣的:(数据结构和算法)