计算机常用算法.ppt
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_1.gif)
![资源得分’ title=](/images/score_05.gif)
《计算机常用算法.ppt》由会员分享,可在线阅读,更多相关《计算机常用算法.ppt(84页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、计计 算算 机机 常常 用用 算算 法法安吉实验初中安吉实验初中 陈国锋陈国锋7、动态规划、动态规划1、穷举法(枚举法)、穷举法(枚举法)2、递归法、递归法3、回溯法、回溯法 4、模拟法、模拟法 6、分治法、分治法5、贪心法贪心法枚举法枚举法穷举法穷举法枚举法(通常也称为穷举法)是指在一个有穷的可能的解的集合中,枚举出集合中的每一个元素,用题目给定的约束条件去判断其是否符合条件,若满足条件,则该元素即为整个问题的解;否则就不是问题的解。枚举的思想往往是最容易想到的一种解题策略,枚举法从本质上说是一种搜索的算法,但适用枚举法解题必须满足下列条件:1)可预先确定解元素的个数n,且问题的规模不是特别
2、大;2)对于每个解变量A1,A2,。An的可能值必须为一个连续的值域。枚举法的算法流程:设ai1为解变量Ai的最小值;aik为解变量的最大值;其中1in.A1a11,a12,a1KA2a21,A22,A2KAiai1,Ai2,AiKAnan1,An2,AnK我们称解变量为枚举变量。例如某问题的枚举变量有三个:A1,A2,A3。A11,2,A22,3,4,A35,6,7则问题的可能解为(A1,A2,A3)(1,2,5),(1,2,6),(1,2,7),(1,3,5),(1,3,6),(1,3,7),(1,4,5),(1,4,6),(1,4,7),(2,2,5),(2,2,6),(2,2,7),(
3、2,3,5),(2,3,6),(2,3,7),(2,4,5),(2,4,6),(2,4,7)在上述18个可能解的集合中,满足问题给定的检验条件的解元素即为问题的解。枚举法的优化方法:1)减少枚举的变量,在使用枚举法之前,先考虑一下解元素之间的关联,将一些非枚举不可的解元素列为枚举变量,其他元素通过计算得出解元素的可能值。例1、巧妙填数。将19这9个数字填入到9个空格中。每一横行的三个数字组成一个三位数。如果要使第二行的三个三位数是第一行的2倍,第三行的三位数是第一行的三倍,应怎样填数。如图1923845762)减少枚举变量的值域3)分解约束条件,将拆分的约束条件嵌套在相应的循环体间。本题目有9
4、个格子,要求填数,如果不考虑问题给出的条件,共有9!=362880种方案,在这些方案中符合条件的即为解。因此可以用枚举法。但仔细分析问题,显然第一行的数不会超过400,实际上只要确定第一行的数就可以根据条件算出其他两行的数了。这样仅需枚举400次。例2、有四个学生,上地理课时提出我国四大淡水湖的排序如下:甲:洞庭湖最大,洪泽湖最小,鄱阳湖第三;乙:洪泽湖最大,洞庭湖最小,鄱阳湖第二,太湖第三;丙:洪泽湖最小,洞庭湖第三;丁:鄱阳湖最大,太湖最小,洪泽湖第二,洞庭湖第三;对于各个湖泊应处的地位,每个人只说对了一个。根据以上情况,编程序判断各个湖泊应处的地位。算法分析:本题是一个逻辑判断题,一般的
5、逻辑判断题都采用枚举法进行解决。四个湖的大小分别可以有4!=24种排列可能,因为24比较小,因此我们对每种情况进行枚举,然后根据给定的条件判断哪些符合问题的要求。源程序例3、最佳游览路线。某旅游区的街道成网格状。其中东西向的街道都是旅游街,南北向的街道都是林阴道。由于游客众多,旅游街被规定为单行道,游客在旅游街上只能从西向东走,在林阴道上则既可从南向北走,也可以从北向南走。阿龙想到这个旅游街游玩,他的好友阿福给了他一些建议,用分值表示所有旅游街相邻两个路口之见的街道值得游览的程度,分值是从-100到100的整数,所有林阴道不打分。所有分值不可能全是负分。如图:-50-4736-30-2317-
6、19-34-13-8-42-3-4334-45北南东西输入数据:输入文件是input.txt.文件的第一行是两个整数m和n,之间用一个空格隔开,m表示有多少条旅游街(1m100),n表示有多少条林阴道(1n20001)。接下来的m行依次给出了由北向南每条旅游街的分值信息。每行有n-1个整数,依次表示了自西向东旅游街每一小段的分值。同一行相邻两个数之间用一个空格隔开。输出数据:输出文件是output.txt。文件只有一行,是一个整数,表示你的程序找到的最佳游览线路的总分值。Input.txtOutput.txt36-5047363023171934138-4234334-4584Lij为第I条旅
7、游街上自西向东第j段的分值(1im,1jn-1)。例如样例中L12=17,L23=-34,L34=34。我们将网格状的旅游区街道以林阴道为界分为n-1个段,每一段由m条旅游街的对应成段,即第j段成为L1j,L2j,。Lmj(1jn-1)。由于浏览方向规定横向自西向东,纵向即可沿林阴道由南向北,也可由北向南,而横行的街段有分值,纵行无分值,因此最佳游览路现必须具备如下三个特证:1)来自若干个连续的段,每一个段中取一个分值;2)每一个分值是所在段中最大的;3)起点段和终点段任意,但途经段的分值和最大。设Li为第i个段中的分值最大的段。即Li=maxL1i,L2i,。,Lmi(1in-1)。例如对于
8、样例数据:L1=max(-50,17,-42)=17;L2=max(-47,-19,-3)=-3;L3=max(36,-34,-43)=36;L4=max(-30,-13,34)=34;L5=max(-23,-8,-45)=-8;我们把段设为顶点,所在段的最大分值设为顶点的权,各顶点按自西向东的顺序相连,组成一条游览路线。显然,如果确定西端为起点,东端为终点,则这条游览路线的总分值最大。问题是某些段的最大分值可能是负值,而最优游览路线的起点和终点任意,在这种情况下,上述游览路线就不是最佳了。因此,我们只能枚举这条游览路线的所有可能的子路线,从中找出一条子路线ii+1j(1ibestthenbe
9、st:=sum;end;显然,n在120001之间,时间复杂度比较高。于是,我们必须对这个算法进行优化。仍然从顶点1开始枚举最优路线。若当前子路线延伸至顶点时我们发现总分值sum0,则应放弃当前的子路线。因为无论Li+1为何值,当前子路线延伸至顶点i+1后的总分值不会大于Li+1。因此应该从顶点i+1开始重新考虑新的子路线。优化后的算法:best:=0;sum:=0;fori:=1ton-1dobeginsum:=sum+Li;Ifsumbestthenbest:=sum;ifsum0;1,n=0。programfactorial;varn:integer;t:longint;function
10、fac(n:integer):longint;beginifn=0thenfac:=1elsefac:=n*fac(n-1)end;Beginwrite(n=);readln(n);t:=fac(n);writeln(n!=,t);End.例2、斐波那契数列0,1,1,2,3,5,8,13,21,34,55,,从第三项开始,每一项是前两项的和,其递归定义式为:F(n)=0,n=0;1,n=1;F(n-1)+f(n-2),n2。求此数列第n项。参考程序:varn:integer;functionfib(n:integer):integer;beginifn=0thenfib=0elseifn=1
11、thenfib:=1elsefib:=fib(n-2)+fib(n-1);end;beginwriteln(inputn=);readln(n);ifn3。离散事件的递归离散事件的递归例1、简单的背包问题。设有一个背包,可以防如入的重量为s。现有n件物品,重量分别为t1,t2,t3,ti,tn,ti(1in),均为正整数。从n件物品中挑选若干件,使得放入背包的重量之和正好为s.算法分析:用snap(s,n)代表这一问题。1)先取最后一个物品tn放入背包中,若tn=s,正好放入包中,问题解决,输出结果(n,tn)2)若tn1),那么问题可以转化为从剩下的n-1件物品中选取若干件,使得它们的重量和
12、等于包里剩下的可放入重量(s-tn),即snap(s-tn,n-1);而选中的tn还要看后续的问题snap(s-tn,n-1)是否有解,无解的话说明先取的tn不合适,就要放弃tn,在剩余物品中重新开始挑选,即有snap(s,n)snap(s,n-1)。3)若tns,则不能放入包中,还得继续挑选;若还剩物品(即n1),那么问题转化为从剩余n-1件物品中选取若干个,使得她们的重量和等于s,即snap(s,n)snap(s,n-1)。在2)、3)中就出现了递归定义,而1)是有解时递归结束的条件;如果无解时,只有当2)、3)中所剩的物品不够的话问题就不能继续执行,这也是递归结束的条件。回溯法回溯法回溯
13、是重要的算法之一,有一些问题,要求找到一组解,或要求找到一个满足某些限制的最优解。对于解决这样的问题,可以通过使用彻底的搜索方法来解决。然而,彻底搜索的运算量很大,有时大到计算机承受不了的程度。彻底的搜索,要进行大量的比较,大量的舍弃,以大量的运算,大量的时间为代价。因此,用穷举法解某些实际问题是不现实的,回溯算法为我们提供了一个好方法,使用回溯法可以大大减少实际的搜索。例如,迷宫问题,八皇后问题,骑士周游世界问题。算法思想:通过对问题的分析,找出一个解决问题的线索,然后沿着这个线索往前试探,若试探成功,就得到解,若试探失败,就逐步往回退,换别的路线再往前试探。实际上是广度与深度搜索结合的搜索
14、,深度搜索过程中碰到条件不满足,则退回上一层,在每一层上也进行全面的搜索。关键:找到回溯的条件。求解八皇后问题:在n*n个方块排成n行n列的棋盘上,如果两个皇后位于同一行、同一列或同一对角线上,则称它们互相攻击。现在要求找出使棋盘上n个皇后互不攻击布局。列号:(8,2,4,1,7,5,3,6)分析分析:为了找出互不攻击的布局,需要对n*n个方案进行检查,将有攻击的布局剔除掉。这是一种例举法。但这种方法对于较大的n,其工作量会急剧的增大,而逐一例举是没有必要的。算法:算法:由于在第一行上的皇后在第一列,则第二行上的皇后就不可能在第一列。首先将每一行上安置一个皇后,并假设第i个皇后在第i行上,用一
15、个一维数组queen1.n用于记录安放皇后的过程中随时记录第i行上的皇后所在的列号。由此可知,在这种情况下,实际上已经剔除了两个皇后在同一行的可能性。因此,在安置每一行上的皇后时,只需考虑每两个皇后不能在同一列或同一对角线上的可能性。从第一行(即i=1)开始布局。设前i-1行上的皇后已布局好,即它们互不攻击。现考虑安排第i行上皇后位置,使之与前i-1行上的皇后也互不攻击。为了实现这一点,可以从第i行皇后的当前位置开始向右搜索。引进集合a,b,c分别表示各列、各条右对角线和各条左对角线上是否放置了皇后。在同一右对角线上,i-j是常量。在同一左对角线上,i+j是常量。第i行第j列上放皇后在第i-j
16、条右对角线和第i+j条左对角线上。能放皇后时为真,不能放皇后时为假。数组queen存放各行皇后所在的列号。骑士周游问题骑士周游问题。给定一个n*n的方阵,共有n2个区域,有一个国际象棋的马置于一个区域上,要求找到一条路径,使马按国际象棋的规则,从开始区域出发,不重复地把n2个区域都恰好经过一次。分析1:由于马按“日”字走,马从本区域起一步最多能达到八个区域。设马所在区域坐标为(i,j),则下一步能达到的8个位置的坐标如下:(i-2,j-1)(3)(i-2,j+1)(2)(i-1,j-2)(4)(i-1,j+2)(1)(i,j)(j+1,j-2)(5)(i+1,j+2)(8)(i+2,j-1)(
17、6)(i+2,j-1)(7)分析2:马从初始位置(i,j)开始,按8个方向(从(1)(8)走,如下一位置在方阵中而且未到过,则马跳到该位置,继续走;如果8个方向的位置都不能落脚,则退一步,上一步为当前步,再按下一个方向继续试跳。算法:Procedure过程名;Begin准备初值;repeatwhile选择范围不超过边界且工作未完成dobegin分析条件;保证不满足条件不进行if成功then进栈;由第选择开始进入下一层次(往下走)else本层更换选择;横向走end;if工作未完成then退栈;原来的上一层更换为下一选择,回溯,上层横向走until全部工作完成;输出;end;随机数的介绍在自然界和
18、日常生活中,许多现象具有不确定的性质,有些问题甚至很难建立数学模型,或者很难用计算机建立递推,递归,枚举,回溯法等算法.在这种情况下,一般采用模拟策略.在对实际问题中的随机现象进行数学模拟时,利用计算机产生的随机数是必不可少的,由于用计算机产生的随机数总是受字长的限制,其随机的意义要比实际问题中真实的随机变量稍差,因此,通常将计算机产生的随机数称为伪随机数.TURBO.PASCAL的系统中有两个产生伪随机数的单元:Randomize过程伪随机数发生器初始化,Random(range)函数产生一个范围在0 xrange的伪随机数x,range和x都为word类型.模拟法模拟法模拟法:就是模拟某个
19、过程,通过改变数学的各种参数,进而观察变更这些参数所引起过程状态的变化.一般题目给定或者隐含某一概率.设计者利用随机函数和取整函数设定某一范围的随机值,将符合概率的随机值作为参数.然后根据这一模拟的数学模型展开算法.模拟策略的关键:是如何按照概率的要求确定随机值的范围.这个随机值设计得好,模拟效果就好.例一:甲乙两人抓n个棋子,谁抓最后一个谁赢.每一次只能抓一个或两个,但不能为零个.甲方为计算机,对弈方为乙(由随机数替代).设计一个程序使计算机尽可能赢.输入:棋子数n,先下手的方k(k=b对方先下;k=a,计算机先下).输出:游戏过程.一行表示一步:现有棋子数,被抓走的棋子数.最后一行为赢方的
20、名字.这个问题的算法核心是:要置对方于死地,必须使余下的棋子是1+2=3的整数倍.因此,当甲方处在棋子数是3的倍数时要小心等待.一旦对方错一步,赶紧控制余下棋子数为3的倍数.设:b乙方抓走的棋子数.每一次轮到乙方抓时,则随机产生b(1+random(2).a-甲方抓走的棋子数.轮到甲方抓时,若剩余的棋子数非3的整数倍,则应使抓掉后是3的整数倍.若剩余的棋子数为3的整数倍,则随机产生a(1+random(2).计算过程如下:输入棋子总数n和先下手一方的名字kRandomize;Whilen0dobeginifk=bthenbeginx:=random(2);b:=1+x;ifn-b=0thenb
21、egin输出现有0枚棋子,乙方抓走n枚棋子;输出乙方赢;break;endelsebeginn:=n-b;输出现有n枚棋子,乙方抓走b枚棋子;K:=aEnd;Elsebegina:=nmod3;ifa0then若剩余棋子数为3的整数倍,则调整每次抓的棋数elsex:=random(2);a:=1+x;ifn-a=2*k+1),甲每次取a颗,(N,k,a均为随机数),乙怎样取赢的可能性最大?设甲为计算机产生的随机数,乙为由你编的计算机程序。猜数游戏:人和计算机做猜数游戏。人默想一个四位数,由计算机来猜。计算机将所猜的数显示到屏幕上,并问两个问题:(1)有几个数字猜对了?(2)猜对的数字中有几个位
22、置也对?人通过键盘来回答这两个问题。计算机一次又一次地猜,直到猜对为止。比如我们默想的一个数是5122,假定计算机第一次猜1166,然后问你:(1)有几个数字猜对了?1(2)猜对的数字中有几个位置也对?1假定计算机第二次猜1287(1)有几个数字猜对了?2(2)猜对的数字中有几个位置也对?0假定计算机第三次猜5122(1)有几个数字猜对了?4(2)猜对的数字中有几个位置也对?4计算机显示最后猜中的数,并报告共猜了几次?问题问题1:编程实现这样一个猜数的游戏程序。屏幕显示格式为:第二行显示计算机所猜的四位数。第三行提问猜对的数字个数,用“Number:”第四行提问位置对的数字个数,用“Posit
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 计算机 常用 算法
![提示](https://www.taowenge.com/images/bang_tan.gif)
限制150内