计算机算法设计与分析第2章递归和分治策略

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

, n>=1
2019/4/14
24
2.1 递归的概念
例3

Ackerman函数
A(n,m)的自变量m的每一个值都定义了一个单变量 函数(根据m的不同可得到基于n的不同函数!): m=2时,
A(n,2)=A(A(n-1,2),1)


n=0, A(0,2)=1 n=1, A(1,2)=A(A(0,2),1)= A(1,1)= 2 n>=2,A(n,2)=A(A(n-1,2),1)=2A(n-1,2) A(n,2)= 2^n , n>=0
A(1,0) 2 A(0, m) 1 A(n,0) n 2 A(n, m) A( A(n 1, m), m 1)
2019/4/14
m 0, n 1 m 0, n 0 m 0, n 2 m 1, n 1
21
2.1 递归的概念
2019/4/14 22
2.1 递归的概念
例3

Ackerman函数
A(n,m)的自变量m的每一个值都定义了一个单变量 函数(根据m的不同可得到基于n的不同函数!): m=0时,
n=0,

A(0,0)=1 n=1, A(1,0)=2 n>=2, A(n,0)=n+2
2019/4/14
23
2019/4/14
32
2.1 递归的概念
与原问题类型一致而其规模却不断缩小,最终使子 问题缩小到很容易直接求出其解。 这自然导致递归过程的产生。

分治与递归像一对孪生兄弟,经常同时应用在 算法设计之中,并由此产生许多高效算法。
14
2019/4/14
2.1 递归的概念

在算法设计中使用递归技术,往往使算法的描述简单明了、 易于理解(?)、容易编程和验证。 在计算机软件领域,递归算法是一种非常重要并且不可或缺 的算法。
2019/4/14
30
2.1 递归的概念
例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。
假设:
• • •
R={r1,r2,…,rn}是要进行排列的n个元素,Ri=R-{ri}。 集合X中元素的全排列记为perm(X)。
(ri)perm(X)表示在全排列perm(X)的每一个排列前加上前
得的子问题是同类问题,并要求原问题的解可以通过组 合子问题的解来获取。
2019/4/14
13
2.1 递归的概念

定义:
直接或间接地调用自身的算法称为递归算法。 用函数自身给出定义的函数称为递归函数。

由分治法产生的子问题往往是原问题的较小模 式,这就为使用递归技术提供了方便:
在这种情况下,反复应用分治手段,可以使子问题
26
2019/4/14
2.1 递归的概念
例3

Ackerman函数(以下了解即可)
定义单变量的Ackerman函数A(n)为:A(n)=A(n,n)。 定义其拟逆函数α(n)为:α(n)=min{k|A(k)≥n}。 即α(n)是使n≤A(k)成立的最小的k值。 因为:A(0)=1,A(1)=2,A(2)=4,A(3)=16 4,A(4)=? 所以:α(1)=0,α(2)=1,α(3)= α(4)=2 α(5)=… α(16)=3 α(n)在复杂度分析中常遇到。对于通常所见到的正整数n, 有α(n)≤4。但在理论上α(n)没有上界,随着n的增加,它 以难以想象的慢速度趋向正无穷
分治法的设计思想是,将一个难以直接解决 的大问题,分割成一些规模较小的相同问题, n = 以便各个击破,分而治之。 T(n)
凡治众如治寡,分数是也。 n/2 n/2 ----孙子兵法 n/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)
2019/4/14
27
2.1 递归的概念
例3 Ackerman函数(以下了解即可) 练习:采用递归和非递归方式实现Ackerman函数
2019/4/14
28
2.1 递归的概念
例4

排列问题
设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。 从n个不同元素中任取m(m≤n)个元素,按照一定的顺序排列起 叫做从n个不同元素中取出m个元素的一个排列,当m=n时所有的 排列情况叫全排列。 如1,2,3三个元素的全排列为:
(4)棋盘覆盖;
(5)合并排序和快速排序; (6)线性时间选择;
(7)最接近点对问题;
(8)循环赛日程表。
2019/4/14 2
算法总体思想

计算机求解的复杂度(时间与空间)与问题的规 模有关,回忆: a) 1、2、3……n个元素的排序问题; b) 1、2、3……n个元素的查找问题;

结论:

2019/4/14
15
2.1 递归的概念

递归的使用场合:
① 数据结构本身是递归定义的,其实现算法往往是递
归算法,比如二叉树和图等 ② 求解过程需要递归,算法描述简捷其易于理解及分 析,比如阶乘计算
下面来看几个实例
2019/4/14
16
2.1 递归的概念
例1 阶乘函数 阶乘函数可递归地定义为:
边界条件: 非递归定义 的初始值
1 n0 F ( n) 1 n 1 F (n 1) F (n 2) n 1
数列的第n项的值是它前面 两项之和
2019/4/14 19
边界条件 递归方程
2.1 递归的概念
例2 Fibonacci数列(菲不尼茨数列)
第n个Fibonacci数可递归地计算如下:
2019/4/14
5
算法总体思想

分治法的可行性: 如果原问题可以分成k个子问题,1<k<=n 子问题都可解 可利用子问题的解求出原问题的解
2019/4/14
6
算法总体思想
问题分解是求解复杂问题时很自然的做法。 求解一个复杂问题可以将其分解成若干个子问
题,子问题还可以进一步分解成更小的问题,直 到分解所得的小问题是一些基本问题,并且其求 解方法是已知的,可以直接求解为止。
T(n)
n/2
=
n/2
n
n/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/4
10
算法总体思想

将求向上逐步求出原来问题的解。
int factorial(int n) { if (n==0) return 1; return n*factorial(n-1); }
2019/4/14
18
2.1 递归的概念
例2 Fibonacci数列(菲不尼茨数列) 无穷数列1,1,2,3,5,8,13,21,34,55,……, 称为Fibonacci数列。它可以递归地定义为:
2019/4/14
7
算法总体思想

将要求解的较大规模的问题分割成k个更小规 模的子问题。
T(n)
=
n
T(n/2)
2019/4/14
T(n/2)
T(n/2)
T(n/2)
8
算法总体思想

对这k个子问题分别求解。如果子问题的规模 仍然不够小,则再划分为k个子问题,如此递 归的进行下去,直到问题规模足够小,很容易 求出其解为止。
T(n)
n/2
=
n/2
n
n/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/4
2019/4/14 9
算法总体思想

将求出的小规模的问题的解合并为一个更大规模 的问题的解,自底向上逐步求出原来问题的解。
例3 Ackerman函数
前2例中的函数都可以找到相应的非递归方式定义:
n! 1 2 3 (n 1) n
n 1 n 1 1 5 1 1 5 F (n) 2 2 5
本例中的Ackerman函数却无法找到非递归的定义!!!
25
2019/4/14
2.1 递归的概念
例3 Ackerman函数 A(n,m)的自变量m的每一个值都定义了一个单变量 函数(根据m的不同可得到基于n的不同函数!):

m=3时,类似的可以推出
A(n,3)=
2 2 n
2 2
, n>=0

m=4时,A(n,4)的增长速度非常快,以至于没有适 当的数学式子来表示这一函数。

1,2,3 1,3,2 2,1,3 2,3,1 3,1,2 3,2,1
2019/4/14
29
2.1 递归的概念
例4 排列问题 设计一个递归算法生成n个元素{r1,r2,…,rn}的全排列。
集合X中元素的全排列记为perm(X)。
(r)perm(X)表示在全排列perm(X)的每一个排列 前加上前缀r得到的排列。
T(n)
n/2
=
n/2
n
n/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/4
11
算法总体思想

将求出的小规模的问题的解合并为一个更大规模 的问题的解,自底向上逐步求出原来问题的解。
多个元素的排序和查找比较少元素的排序和查找复杂 和困难的多! 问题的规模越小,解题所需的计算时间往往也越短!
3
2019/4/14
算法总体思想

想法: 能否将“多个元素的排序和查找”变成数个 “较少元素的排序和查找”,分别进行???

分治
2019/4/14
4
算法总体思想

分治法的设计思想: 将一个难以直接解决的大问题,分割成一些 规模较小的相同问题,以便各个击破,分而 治之
2019/4/14 12
算法总体思想
通常,由分治法所得到的子问题与原问题具有相同的类
型。如果得到的子问题相对来说还太大,则可反复使用 分治策略将这些子问题分成更小的同类型子问题,直至 产生出不用进一步细分就可求解的子问题。由此可知, 分治法求解很自然地可用一个递归过程来表示。
总而言之:分治法作为一种算法设计策略,要求分解所
???????????????????????????????1125125151nnnf本例中的ackerman函数却无法找到非递归的定义
第2章
递归与分治策略
2019/4/14
1
学习要点:


理解递归的概念。
掌握设计有效算法的分治策略。 通过下面的范例学习分治策略设计技巧。
(1)二分搜索技术; (2)大整数乘法; (3)Strassen矩阵乘法;
n0 1 n! n(n 1)! n 0
较小自变量的函数值表 示较大自变量的函数值
递归方程: 递归定义式
边界条件与递归方程是递归函数的二个要素,
递归函数只有具备了这两个要素,才能在有限 次计算后得出结果。
2019/4/14 17
2.1 递归的概念
例1 阶乘函数
第n个阶乘可递归地计算如下:
2.1 递归的概念
例3

Ackerman函数
A(n,m)的自变量m的每一个值都定义了一个单变量 函数(根据m的不同可得到基于n的不同函数!): m=1时,
n=0,

A(0,1)=1 n>=1,A(n,1)=A(A(n-1,1),0)

n=1,A(1,1)=A(A(0,1),0)=A(1,0)=2 n>1, A(n,1)=A(n-1,1)+2 A(n,1)=2*n
缀得到的排列。
2019/4/14
31
2.1 递归的概念
例4 排列问题 (/view/1710135.htm)

• •
全排列问题可以定义如下: 当n=1时,perm(R)=(r),其中r是集合R中唯一的元素; 当n>1时,perm(R)由(r1)perm(R1), (r2)perm(R2),…,(rn)perm(Rn)构成。
int fibonacci(int n) { if (n <= 1) return 1; return fibonacci(n-1)+fibonacci(n-2); }
2019/4/14
20
2.1 递归的概念
例3 Ackerman函数(阿克曼函数)
当一个函数及它的一个变量是由函数自身定义时,称这个函数 是双递归函数。 Ackerman函数A(n,m)定义如下--有两个独立的整型变量m、n:
相关文档
最新文档