《计算机算法设计与分析》PPT第二章 递归与分治策略
第2章 递归与分治策略
2014-1-12
学习要点:
理解递归的概念。 掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。(1)二分搜索技术 (2)大整数乘法 (3)Strassen矩阵乘法 (4)棋盘覆盖 (5)合并排序和快速排序 (6)线性时间选择 (7)最接近点对问题 (8)循环赛日程表
2014-1-12
算法总体思想
将要求解的较大规模的问题分割成 k个更小规模的子问 对这k个子问题分别求解。如果子问题的规模仍然不够 题。 小,则再划分为k个子问题,如此递归的进行下去,直 到问题规模足够小,很容易求出其解为止。
T(n)
=
n
T(n/2)2014-1-12
T(n/2)
T(n/2)
T(n/2)3
将求出的小规模的问题的解合并为一个更大规模的问 对这 k个子问题分别求解。如果子问题的规模仍然不够 题的解,自底向上逐步求出原来问题的解。 小,则再划分为k个子问题,如此递归的进行下去,直 到问题规模足够小,很容易求出其解为止。
T(n)n/2
=n/2
nn/2 n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/42014-1-12 4
将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
T(n)n/2
=n/2
nn/2 n/2
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/42014-1-12 5
将求出的小规模的问题的解合并为一个更大规模的问 题的解,自底向上逐步求出原来问题的解。
n = 分治法的设计思想: T(n) 将一个难以直接解决的大问题,分割成一些规 模较小的相同问题,以便各个击破,分而治之。 n/2 n/2 n/2 n/2 凡治众如治寡,分数是也。 ----孙子兵法2014-1-12 6
T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4) T(n/4)T(n/4)T(n/4)T(n/4
2.1 递归的概念
递归算法:直接或间接地调用自身的算法。 递归函数:用函数自身给出定义的函数。 由分治法产生的子问题往往是原问题的较小模式,方 便使用递归技术。 此时,反复应用分治手段,可使子问题与原问题类型 一致而规模不断缩小,最终使子问题缩小到很容易直 接求出其解。 自然导致递归过程的产生。 分治与递归像一对孪生兄弟,经常同时应用在算法设 计之中,并由此产生许多高效算法。 下面来看几个实例。7
2014-1-12
例1
阶乘函数 阶乘函数可递归地定义为:
边界条件
n 0 1 n! n(n 1)! n 0递归方程 边界条件与递归方程是递归函数的二个要素,递归函 数只有具备了这两个要素,才能在有限次计算后得出 结果。2014-1-12 8
例2 Fibonacci数列 无穷数列1,1,2,3,5,8,13,21,34,55
, ,称为 Fibonacci数列。 边界条件 它可以递归地定义为: 1 n 0 F ( n) 1 n 1 F (n 1) F (n 2) n 1 递归方程 第n个Fibonacci数可递归地计算如下: int fibonacci(int n) { if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); } 9 2014-1-12
例3 Ackerman函数 当一个函数及它的一个变量是由函数自身定义时,称这 个函数是双递归函数。 Ackerman函数A(n,m)定义如下:
A(1,0) 2 A(0, m) 1 m 0 A(n,0) n 2 n 2 A(n, m) A( A(n 1, m), m 1) n, m 110 10
例3 Ackerman函数 前2例中的函数都可以找到相应的非递归方式定义:
n! 1 2 3 (n 1) nn 1 n 1 1 5 1 1 5 F ( n) 2 2 5
但本例中的Ackerman函数却无法找到非递归的定义。11 11
例3 Ackerman函数 A(n,m)的自变量m的每一个值都定义了一个单变量函数: m=0时,A(n,0)=n+2 m=1时,A(n,1)=A(A(n-1,1),0)=A(n-1,1)+2,和 A(1,1)=2故A(n,1)=2*n m=2时,A(n,2)=A(A(n-1,2),1)=2A(n-1,2),和 A(1,2)=A(A(0,2),1)=A(1,1)=2,故A(n,2)= 2n 。
12
m=3时,类似的可以推出
2 n12
2
2 2
m=4时,A(n,4)的增长速度非常快,以至于没有适当的 数学式子来表示这一函数。
例3 Ackerman函数 定义单变量的Ackerman函数A(n)为,A(n)=A(n,n)。 定义其拟逆函数α(n)为:α(n)=min{k|A(k)≥n}。 即α(n)是使n≤A(k)成立的最小的k值。 α(n)在复杂度分析中常遇到。对于通常所见到的 正整数n,有α(n)≤4。但在理论上α(n)没有上界, 随着n的增加,它以难以想象的慢速度趋向正无穷 大。
13
例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。设R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为perm(X)。 (ri)perm(X)表示在全排列perm(X)的每一个排列前加上前 缀得到的排列。 R的全排列可归纳定义如下: 当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1),(r2)perm(R2),…, (rn)perm(Rn)构成。 根据这一递归定义,可以设计相应的递归算法,见P112014-1-12 14
例4
排列问题
void Perm(Type list[],int k,int m){//递归产生list[k:m]的所有排列 if(k==m) {//只剩下一个元素 for(int i=0;i<=m;i++) cout<<list[i]; cout<<endl; } else//还有多个元素待排列,递归产生排列 for(int i=k;i<=m;i++){ Swap(list[k],list[i]); Perm(list,k+1,m); Swap(list[k],list[i]; } }15 15
算法Perm(list,k,m)递归地产生所有前缀 是list[0:k-1],且后缀是list[k:m]的全 排列的所有排列。
2014-1-12
…… 此处隐藏:1213字,全部文档内容请下载后查看。喜欢就下载吧 ……相关推荐:
- [综合文档]应答器设备技术规范(征求意见稿)A1
- [综合文档]教师 2012年高考政治试题按考点分类汇
- [综合文档]保险公司的总经理助理竞职演说
- [综合文档]卫生应急大练兵大比武活动考试--题库(
- [综合文档]徐州经济技术开发区总体规划环境影响报
- [综合文档]汉语拼音表(带声调)
- [综合文档]二年级 上 思维训练( 1~18)
- [综合文档]特色学校五年发展规划
- [综合文档]机床经常出现报警“X1轴定位监控”
- [综合文档]《电子技术基础》21.§5—2、3、4 习题
- [综合文档]浙江省深化普通高中课程改革
- [综合文档]CRISP原理 - 图文
- [综合文档]2017年电大社会调查研究与方法形考答案
- [综合文档]浅析建筑施工安全毕业论文
- [综合文档]《回忆我的母亲》名师教案
- [综合文档]装饰装修工程监理规划
- [综合文档]三下乡心得体会-文艺
- [综合文档]柱计算长度系数 - 图文
- [综合文档]全流程思考,提高燃电系统热电转换率--
- [综合文档]2018年嘉定区中考物理一模含答案
- 433M车库门滚动码遥控器
- 8、架空线路施工规范
- 大学四年声乐学习的体会
- 新北师大版五年级数学上册《轴对称再认
- 部编版五年级上册语文第六单元小结复习
- 小学六年级英语形容词用法
- 第2课 抗美援朝保家卫国 课件01(岳麓版
- 2015年天津大学运筹学基础考研真题,考
- 微机计算机控制技术课后于海生(第2版)
- 安全教育实践活动
- Delphi程序设计教程_第1章_Delphi概述
- 第八讲 工业革命与启蒙运动
- 《中华人民共和国药典》2005年版二部勘
- 科粤版九年级化学2.3构成物质的微粒(1)
- 西师大版数学三年级下册《长方形、正方
- ch6_冒泡排序演示
- 第4章 冲裁模具设计
- 浙江中小民营企业员工流失论文[终稿]
- 再议有线数字电视市场营运模式
- 昆明供水工程监理大纲




