1递归与分治法论述.ppt

  1. 1、本文档共47页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
1 递归与分治法 学习要点: 递归 分治策略 范例 (1)汉诺塔问题; (2) 插入排序; (3)最大值和最小值问题; (4) 归并排序和快速排序; (5) 线性时间选择; (6) 二分有哪些信誉好的足球投注网站技术; 思考题:循环赛日程表。 1.1 递归 递归算法解题通常有三个步骤: (1)分析问题、寻找递归:找出递归方程式。 (2)设置边界、控制递归:找出递归终止条件,即 算法易解的最小规模问题。 (3)设计函数、确定参数。 1.2 分治法的思想 将要求解的较大规模的问题分割成k个更小规模的子问题。 对这k个子问题分别求解。如果子问题的规模仍然不够小,则再划分为k个子问题,如此递归的进行下去,直到问题规模足够小,很容易求出其解为止。 分治法求解的几个步骤: (1)分解 将原问题分解为若干个相互独立、与原问题形式相 同的子问题; (2)求解 若子问题容易被解决则直接解,否则再继续分解为 更小的子问题,直到容易解决; (3)合并 将已求解的各个子问题的解,逐步合并以得到原问 题的解。 有时问题分解后,不必求解所有的子问题,也就不必作第三步的操作。 比如折半查找,在判别出问题的解在某一个子问题后,其它的子问题就不必求解 了,问题的解就是最后(最小)的子问题的解。分治法的这类应用,称为“减治法”。 分治法的适用条件 分治法所能解决的问题一般具有以下几个特征: 该问题的规模缩小到一定的程度就可以容易地解决; 该问题可以分解为若干个规模较小的相同问题; 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 例 1.3.1 汉诺塔问题 满足分治法的适用条件 该问题可以分解为若干个规模较小的相同问题; 该问题的规模缩小到一定的程度就可以容易地解决; 利用该问题分解出的子问题的解可以合并为该问题的解; 该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。 算法和分析见例1.1.5 例1.3.3 找最大值和最小值 如果要在含有n个不同元素的集合中同时找出集合中的最大和最小元素,最简单的方法是将元素逐个进行比较。 maxmin(type A[ ],int n) { max= A[1]; min = A[1]; for (i =1;i=n;i++) { if (max A[i]) max = A[i]; if (min A[i]) min = A[i]; } } 该算法的时间复杂度取决于元素比较次数。如果要同时找出最大和最小的元素,则算法在最好、平均和最坏情况下均需要2(n-1)次元素比较。 改进1 : maxmin(type A[ ],int n) { max= A[1]; min =A[1]; for (i =1;i=n;i++) if (max A[i]) max = A[i]; else if (min A[i]) min = A[i]; } 算法中需要n-1次比较得到max。最好的情况是尽快使由小到大取出的,不需要进行与min的比较,共进行n-1次比较。最坏的情况是尽快使由大到小取出的,需要再经过n-1次比较得到min,共进行2n-2次比较。至于在平均情况下,a[i]将有一半的时间比max大,因此平均比较次数是3(n-1)/2。 改进2 : (1)将数据等分为两组(两组数据可能差1),目的是分别选取其中的最大和最小值。 (2)递归分解直到每组元素的个数2,可简单地找到最大和最小值。 (3)回溯时合并子问题的解,在两个子问题的解中大者取大,小者取小,即合并为当前问题的解。 maxmin(分治法).doc 例1.3.4 归并排序 基本思想:将待排序元素分成大小大致相同的2个子集合,分别对2个子集合进行排序,最终将排好序的子集合合并成为所要求的排好序的集合。 void MergeSort(Type a[], int left, int right) { if (leftright) {//至少有2个元素 i=(left+right)/2; //取中点 mergeSort(a, left, i); mer

文档评论(0)

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

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

1亿VIP精品文档

相关文档