递归、分与治和减治 .ppt

  1. 1、本文档共29页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
递归、分与治和减治

* 第4章 递归、分治和减治 1. 递归及其性质 2. 分治法的设计原理 3. 分治法的复杂度推导示例 4. 分治法的复杂度性质 5. 快速排序 6. 平面最接近点对 7. 选择问题 8. 最大子块和 9. 二进制方程 10. 减治 1. 递归及其性质 递归算法是一种自身直接或间接调用自身的算法 使用递归技术使得算法简单明了、易于理解、容易编程和验证。使用递归的程序往往很简单 系统对所有的子程序调用一视同仁,并不区分是不是调用了自身。也就是说,系统并不刻意发现递归成分。这是由子程序调用机制决定的 系统用栈实现子程序调用,也就是用栈实现递归。对比不使用递归,栈结构的操作和维护是额外的时空开销 2. 分治法的设计原理 分治法是把一个问题分解成多个子问题进行处理,然后把子问题的解综合处理,得到原问题的解 划分所得的子问题与原问题结构上等价 如果子问题太大,可以把子问题继续划分,直至划分得到的子问题能够直接求解 分治法的两个重要操作是:分解和综合。其时间复杂度也全部由这二者决定,确切的时间复杂度由二者的对比关系决定 3. 分治法的复杂度推导示例 divide_and_conquer(p(n)){ if ((n=n0) return adhoc(p(n)); //基础项 else{ divide p into p1, p2, ..., pk; //分 for (i=1; i=k; i++) //治 yi = divide_and_conquer(pi); return merge(y1, y2, ..., yk); //合 } } 问题的递归方程: 假定n=km, 变换原方程得: 4. 分治法的复杂度性质 递归方程: x=1时的解: 通解: 符合该条件的分治是多项式级别的时间复杂度 a=c是临界点,ac是真正意义上的分治;ac是减治 5. 快速排序 理想的快速排序算法的复杂度递归方程如下,因为a=c=2,所以其复杂度为O(nlogn): 快速排序的时间复杂度最好情况下是O(nlogn),最坏情况下是O(n2),平均情况是O(nlogn) 可以使用辅助技术选取合理的中轴 当问题规模较小的时候,可以采用其他排序手法 n用于分,2f(n/2)用于治 6. 平面最接近点对 6.1 问题描述 6.2 分治法示意 6.3 分治法求解最近点对问题复杂度分析 6.1 问题描述 给定平面上的n个点的坐标,求出两两距离的最小值及其对应的点对 两点间的距离可以用勾股定理求得 最直观的解法是点之间循环两两求距离,记录其最小值和点对 6.2 分治法示意 a b c d e f g h i a c b e d f i h g f g a d b h c e i a c b e f i h g d a d b c e f g h i 这两个数组逻辑上产生,没有物理上产生 这两个数组物理上产生了 a b c d e f g h i 把问题分解为左右两部分,左右分别求得解,左右最小值中取较小的一个d,作为中间部分最小值的参考 中间部分按照纵坐标序列,每个点只需要比较它上面的7个点即可 如果中间部分得到的最小值更小,则取这个值,否则取d。 d d d 左边的4个格中不可能超过4个点,右边也是 6.3 分治法求解最近点对问题复杂度分析 复杂度函数递归方程: 用分治法求解平面最近点对问题的时间复杂度是O(nlogn) – 因为a=c=2 用分治法求解平面最近点对问题的最大空间使用是O(nlogn) – 但因为调用左右两部分有先后之分,因此空间复杂度为O(n) 上式中,n用于分,2f(n/2)用于治,7n用于合 7. 选择问题 7.1 解法示例 7.2 算法中剩余部分序列大小估计 7.3 分治法求解选择问题复杂度分析 7.1 解法示例 求21个元素中的第8小元素:51, 57, 49, 35, 11, 43, 37, 3, 13, 52, 6, 9, 25, 32, 54, 16, 5,41 ,7, 23, 18 把前面的20个元素划分为5组,最后一个元素不处理,得到4组:(51, 57, 49, 35, 11), (43, 37, 3, 13, 52), (6, 9, 25, 32, 54), (16, 5,41 ,7, 23),取各自的中值:49, 37, 25, 16。在这些中值中取中值25(或者37) 以25为中心,把原数组划分为3部分:小于25的、等于25的、大于25的:(11, 3, 13, 6, 9, 16, 5, 7, 23, 18), (25), (51, 57, 49, 35, 43, 37, 52, 32, 54, 41) 原序列中第8小的数就

文档评论(0)

ctuorn0371 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档