第5讲 计算思维之常用算法设计
合集下载
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
算法应用举例
【案例三】欧几里德算法
即辗转相除法,求两个数的最大公约数
两个整数的最大公约数(也称公因子)是能够同时整
除它们的正整数
辗转相除法求最大公约数
//辗转相除法求两整数m和n的最大公约数 Begin r ←m%n While(r!=0){ m n m ←n //迭代 n ←r //迭代 16 6 r←m%n } 6 4 Print 最大公约数n End 4 2
算法应用举例
【案例二】百钱买百鸡问题
百钱买百鸡:鸡翁一,值钱五 鸡母一,值钱三 鸡雏三,值钱一 问翁、母、雏各几何?
意思是:公鸡每只5元、母鸡每只3元、小鸡3只1元,用100元 钱买100只鸡,求公鸡、母鸡、小鸡的只数。
算法分析
设鸡翁、鸡母、鸡雏的个数分别为x、y、z,根据题意可得如下 方程组:
索范围 在此范围内对所有可能的情况逐一验证 若某个情况符合题目的条件,则为本题的一个答案;若全
部情况验证完后均不符合题目的条件,则问题无解。
算法应用举例
【案例一】警察破案 张三在家中遇害,侦查中发现A、B、C、D四人到过现场。 A说:“我没有杀人。” B说:“C是凶手。” C说:“杀人者是D” D说:“C在冤枉好人。”
r
4
2 0
计算思维之常用算法设计
1 2
3
穷举法 递推法
5 6
7
回溯法 分治法
递归法
迭代法
贪心法
动态规划
4 5
8
基本思想
回溯法实际上一个类似枚举的搜索尝试过程,主要是在搜索 尝试过程中寻找问题的解,当发现已不满足求解条件时,就 “回溯”返回,尝试别的路径。
回溯法即为: – “试探-失败返回-再试探”的问题求解方法,例 如:老鼠走迷宫。
侦查员经过判断四人中有三人说的是真话,四人中有且只有一 人是凶手,凶手到底是谁?
算法分析
用0表示不是凶手,1表示凶手,则每个人的取值 范围就是[0,1]
算法描述
在每个人的取值范围[0,1]的所有可能中进行搜索, 如果表格的组合条件同时满足,即为凶手。
利用伪代码描述算法: For A=0 To 1 For B=0 TO 1 For C=0 To 1 For D=0 To 1 要同时满足 If((A=0)+(C=1)+(D=1)+(D=0))=3 And(A+B+C+D=1) Print A,B,C,D // 输出的值是1的为凶手,
至右下)是否放置了皇后,共15 条主对角线。
主对角线上格子的坐标满足i-
j+7依次是14—0,对应b[15]数
组的15个元素下标
若(i,j)位置的主对角线无皇
后,则b[i-j+7]=0,有皇后则
b[i-j+7]=1
求解思路
j i
数组c[15]标识从对角线(左
下至右上)是否放置了皇后, 共15条从对角线。
根结点的所有可行的子树都要已被搜索遍才结束。
回溯法PK穷举法
从本质上讲,回溯法也是一种穷举法,也是通
过“枚举、判断”来寻找问题的解。
不同的是,穷举法每次枚举的都是问题的一个
完整解,而回溯法每次测试的是解的一部分。
计算思维之常用算法设计
1 2
3
穷举法 递推法
5 6
7
回溯法 分治法
递归法
迭代法
RETURN 1
算法应用举例
【案例二】汉诺塔问题
将n个自上而下从小到大叠在一起的圆盘从A塔座移动到C塔
座。要求:
1.每次只能移动一只圆盘
2.移动时必须大盘在下, 小盘在上 3.只能借助一个辅助塔座
算法分析
将A塔座上面的n-1 个圆盘移到B塔座
初始状态
hanoi(n-1, A, C,B)
13 21 34 55
大
0
1
1
2
2
3
3
5
5
8
8
13 21 34 55 89
总数 1 1
13 21 34 55 89 144
算法分析—根据数列找规律
假设Fn表示第n个月的兔子对数,则可找出如下递推关系:
F1=1
F2=1
F3=F1+F2 ┇
顺推法
Fn=Fn-1+Fn-2
算法描述
算法应用举例
【案例二】猴子吃桃问题
将B塔座上n-1个 圆盘移到C塔座
hanoi(n,A,B,C)
将A塔座上最大 圆盘移到C塔座
move(A, C)
终止状态
hanoi(n-1,B,A,C)
算法描述
void hanoi(int n, char A, char B, char C) { if(n= =1) move(A,C); else { hanoi(n-1,A,C,B); move(A,C); hanoi(n-1,B,A,C); } }
贪心法
动态规划
4 5
8
基本思想
分治法即各个击破,分而治之 问题可以分解为若干个规模小的相同问题 问题分解出的各个子问题是相互独立的,即子问题之间不 包含公共子问题 问题规模缩小到一定程度时可以容易地解决
问题分解出的子问题的解可以oogle的MapReduce技术
小猴有桃若干,当天吃掉一半多一个;第二天接着吃了剩
下的桃子的一半多一个;以后每天都吃尚存桃子的一半零
一个,到第7天早上只剩下1个了,问小猴原有多少个桃子?
算法分析
每天都吃尚存桃子的一半零一个,设第n天的桃子为xn,它 是前一天的桃子数xn-1的一半少1个,即
xn=xn-1 / 2 - 1
倒推法
xn-1=(xn+1)×2
(递推公式)
算法描述
计算思维之常用算法设计
1 2
3
穷举法 递推法
5 6
7
回溯法 分治法
递归法
迭代法
贪心法
动态规划
4 5
8
基本思想
把规模大的、较难解决的问题变成规模较小的、易解决的 同一问题。 规模较小的问题又变成规模更小的问题,并且小到一定程 度可以直接得出它的解,从而得到原来问题的解。 用递归处理问题的过程,就是将问题规模逐步缩小的过程。
5x+3y+z/3=100 x+y+z=100 1≤x<20, 1≤y<33, 3≤z<100, z mod 3=0
测试集合:1≤x<20, 1≤y<33,z=3,6,9,...,99 测试条件:5x+3y+z/3=100 x+y+z=100
算法优缺点
穷举法是唯一一种解决所有问题的一般性方法; 即使效率低下,仍可用穷举法求解一些小规模的问题实例; 如果解决的问题实例不多,而穷举法可用一种可接受的速 度对问题求解,那么花时间去设计一个更高效地算法是得 不偿失的。
递归算法需要考虑的问题
确定递归公式:把规模大的、较难解决的问题变成规模较小、 易解决的同一问题。
确定边界条件:在什么情况下可以直接得出问题的解?这就
是问题的边界条件及边界值。
递归算法的主要优缺点
优点:结构清晰、可读性强,而且容易用数学归纳法来证明 算法的正确性,因此它为设计算法、调试程序带来了很大方
过程。 在使用迭代法解决问题时,首先要确定迭代的变量,然后 要确定停止迭代的条件。 严格地来说,迭代法和递归法一样,是一种编程技术。
算法应用举例
【案例一】斐波拉契数列
算法应用举例
【案例二】求一元非线性方程f(x)=0的解
方程f(x)=0的几何意义
算法分析
求方程解最简单的方法是二分
基本思想
递推法为了得到问题的解,把它推到比原问题简单的问题 求解,可分为顺推法和倒推法。
顺推法,就是先找到递推关系式,然后从初始条件出发,
一步步地按递推关系式递推,直至求出最终结果。
倒推法,就是在不知道初始条件的情况下,经某种递推关
系而获知问题的解,再倒过来,推知它的初始条件。
算法应用举例
计算思维之常用算法设计
1 2
3
穷举法 递推法
5 6
7
回溯法 分治法
递归法
迭代法
贪心法
动态规划
4 5
8
基本思想
基本思想是把一个复杂的庞大的计算过程转化为简单过程
的多次重复。 通过已知条件,利用特定的递推关系可以得出中间推论, 直至得到问题的最终结果。
递推关系,可以抽象为一个简单的数学模型。
(i,j),在这个位置的垂直
方向、水平方向、对角线方 向都不能再放其它皇后。
求解思路
定义三个整型数组:a[8],b[15],c[15] 数组a[8]标识各列是否放置了皇后,如果a[j]=0,表示
第j列没有皇后;若a[j]=1,表示第j列已经放置了皇后。
求解思路
j
i
数组b[15]标识主对角线(左上
四皇后问题
四皇后问题的搜索过程
Q Q ×× Q
Q
×× Q × ×××
Q Q
Q Q
×Q
(a) Q Q
(b) Q
(c) Q ×××Q Q
(d) Q Q Q
(e) Q Q ××Q
×Q
× ×× × (f) (g) (h)
(i)
(j)
数学建模
求解思路
j
设棋盘的横坐标为i,纵坐标
i
为j。当某个皇后占了位置
便。
缺点:递归算法的运行效率相对较低,无论是耗费的计算时
间还是占用的存储空间都比非递归算法要多。通常的解决方
法是消除递归算法中的递归调用,使递归算法转化为非递归 算法。
计算思维之常用算法设计
1 2
3
穷举法 递推法
5 6
7
回溯法 分治法
递归法
迭代法
贪心法
动态规划
4 5
8
基本思想
迭代法也称辗转法,是一种不断用变量的旧值递推新值的
算法应用举例
【案例一】老鼠走迷宫
一只实验室的小老鼠被用
来做迷宫智力实验,科学
家在迷宫的一角放上一块
奶酪,小老鼠要在最快的
时间内找到奶酪。
算法应用举例
【案例二】八皇后问题
1850年,德国著名数学家高斯(Gauss)提出了这一问题,
即:在8*8格的国际象棋上摆放八个皇后,使其不能互相攻 击,即任意两个皇后都不能处于同一行、同一列或同一斜 线上,问有多少种摆法?
法,又称二分区间法
其基本思想是:设f(x)在区间
[a,b]上为连续函数,如果
f(a)*f(b)<0,则f(x)在区间 [a,b]上至少有一个根。如果 f(x)在[a,b]是单调递增或递减 的,则f(x)在区间[a,b]上只存 在一个实根。
算法描述
Step1:求a,b的中点坐标x=(a+b)/2 Step2:计算f(x) Step3:若|f(x)|<ε(ε为一个指定的极小值,控制求 解精度,如10-6),则转Step6,否则继续下面的迭代计 算 Step4:修改有根区间,若f(x)*f(a)>0,则取[x,b]区间, 此时a←x,b不变;若f(x)*f(b)>0,此时,a不变,b ← x Step5:转Step1 Step6:输出x,即方程的近似解 Step7:结束
n2 n2
F5 =3+2= 5
递推求解
问 题 递 推
F4 =F3+F2
F4 =2+1= 3
F3 =F2+F1
F3 =1+1= 2 F2=1 F1=1
结 果 递 推
递归算法描述
Fibonacci数列递归算法的伪代码描述: 输入:正整数n 输出:Fibonacci数列的第n项
Fib(n)
1 2 3 4 ELSE RETURN Fib(n-1)+Fib(n-2) //调用自身 IF n≤2 THEN
递归算法应用举例
【案例一】斐波拉契数列—兔子问题
一个农夫养了一对小兔子,他发现小兔子在出生第二个
月后长成大兔子,每对大兔子每个月可繁殖一对小兔子,
如果一年内没有发生死亡现象,那么,一年后这个农夫
将有多少对兔子?
递归算法分析
递归算法分析—递归过程
递归定义
F5 =F4+F3
1 Fn Fn 1 Fn 2
【案例一】斐波拉契数列—兔子问题
一个农夫养了一对小兔子,他发现小兔子在出生第二个
月后长成大兔子,每对大兔子每个月可繁殖一对小兔子,
如果一年内没有发生死亡现象,那么,一年后这个农夫
将有多少对兔子?
算法分析—列出每个月的兔子数
算法分析—列出每个月的兔子数
月数 1 2 小
1 0 3 1 4 1 5 2 6 3 7 5 8 8 9 10 11 12
每条从对角线上格子的坐标满
足i+j依次为0—14,对应c[15]
数组的15个元素下标。
如果某条从对角线上已经有皇
后,则为c[i+j]=1,否则
c[i+j]=0
回溯算法描述
回溯法求解
若使用回溯法求任一个解时,只要搜索到问题的
一个解就可以结束。
若用回溯法求问题的所有解时,要回溯到根,且
计算思维导论
——感悟数字化生存的智慧
数计学院 刘光蓉
计算思维之常用算法设计
1 2
3
穷举法 递推法
5 6
7
回溯法 分治法
递归法
迭代法
贪心法
动态规划
4 5
8
计算思维之常用算法设计
1 2
3
穷举法 递推法
5 6
7
回溯法 分治法
递归法
迭代法
贪心法
动态规划
4 5
8
基本思想
采用搜索的方法,根据题目的部分条件确定答案的大致搜