ImageVerifierCode 换一换
格式:DOCX , 页数:17 ,大小:145.65KB ,
资源ID:3801555      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/3801555.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(算法设计与分析的实验报告.docx)为本站会员(b****3)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

算法设计与分析的实验报告.docx

1、算法设计与分析的实验报告实验一 递归与分治策略一、实验目的1加深学生对分治法算法设计方法的基本思想、基本步骤、基本方法的理解与掌握;2提高学生利用课堂所学知识解决实际问题的能力;3提高学生综合应用所学知识解决实际问题的能力。二、实验内容1、设a0:n-1是已排好序的数组。请写二分搜索算法,使得当搜索元素x不在数组中时,返回小于x的最大元素位置i和大于x的最小元素位置j。当搜索元素在数组中时,i和j相同,均为x在数组中的位置。写出三分搜索法的程序。三、实验要求(1)用分治法求解上面两个问题; (2)再选择自己熟悉的其它方法求解本问题; (3)上机实现所设计的所有算法;四、实验过程设计(算法设计过

2、程)1、已知a0:n-1是一个已排好序的数组,可以采用折半查找(二分查找)算法。如果搜索元素在数组中,则直接返回下表即可;否则比较搜索元素x与通过二分查找所得最终元素的大小,注意边界条件,从而计算出小于x的最大元素的位置i和大于x的最小元素位置j。2、将n个元素分成大致相同的三部分,取在数组a的左三分之一部分中继续搜索x。如果xa2(n-1)/3,则只需在数组a的右三分之一部分中继续搜索x。上述两种情况不成立时,则在数组中间的三分之一部分中继续搜索x。五、实验结果分析二分搜索法:三分搜索法:时间复杂性:二分搜索每次把搜索区域砍掉一半,很明显时间复杂度为O(log n)。(n代表集合中元素的个数

3、)三分搜索法:O(3log3n)空间复杂度:O(1)。六、实验体会本次试验解决了二分查找和三分查找的问题,加深了对分治法的理解,收获很大,同时我也理解到学习算法是一个渐进的过程,算法可能一开始不是很好理解,但是只要多看几遍,只看是不够的还要动手分析一下,这样才能学好算法。七、附录:(源代码)二分搜索法:#include #include int binarySearch(int a,int x,int n)int left=0;int right=n-1;int i,j;while(leftamiddle)left=middle+1;else right=middle-1;i=right;j=

4、left;return 0; int main() int a10=0,1,2,3,4,5,6,7,8,9; int n=10;int x=9;if(binarySearch(a,x,n) cout找到endl;else cout找不到=bi,而对于某些就j,j!=i,有aibj。既不能将一个作业分开由两台机器处理,也没有一台机器能同时处理2个作业。设计一个动态规划算法,使得这两台机器处理完这n个作业的时间最短(从任何一台机器开工到最后一台机器停工的总的时间)。研究一个实例:(a1,a2,a3,a4,a5,a6)=(2, 5, 7, 10, 5, 2); (b1,b2,b3,b4,b5,b6)

5、= (3, 8, 4, 11, 3, 4)。2、长江游艇俱乐部在长江上设置了n个游艇出租站1,2n。游客可在游艇出租站租用游艇,并在下游的任何一个游艇出租站归还游艇。游艇出租站i到游艇出租站j之间的租金r(i,j)1=ij=n。设计一个算法,计算出游艇1到游艇n所需最少租金。三、实验要求(1)用动态规划思想求解最优问题;(2)再选择自己熟悉的程序设计语言实现所有算法;(3)分析所设计的算法的时间/空间复杂性。四、实验过程设计(算法设计过程)1、对于给定的2台处理机A和B处理n个作业,找出一个最优调度方案,使2台机器处理完这n个作业的时间最短。2、对于给定的游艇出租站i到游艇出租站j之间的租金为

6、r(i,j),1=ij=n,计算出游艇1到游艇n所需最少租金。五、实验结果分析独立任务最优调度问题:租用游艇问题:时间复杂性:独立任务最优调度问题:O(n*Sum)六、实验体会对于算法来说,没有最好,只有更好,算法的结果不一定是最佳答案,但至少是最接近最佳答案的。在权衡算法时间复杂度和空间复杂度的情况下,找到一个在时间和空间都能接受的算法才是上上之策。七、附录:(源代码)独立任务最优调度问题:using System;namespace zydd class Program static void DlrwZydd(int a, int b, int n, int least, string

7、result) for (int i = 0; i n; i+)leasti = 99;int aSum = 0, bSum = 0;for (int i = 0; i n; i+)aSum += ai;bSum += bi;int Sum = 1 + Math.Min(aSum, bSum);int, timeA = new intn, Sum; int, timeB = new intn, Sum; int, timeMax = new intn, Sum; char, who = new charn, Sum; char tempRlt = new charn; for (int i =

8、 0; i = a0; i+) timeA0, i = i;if (i a0) timeB0, i = b0; who0, i = b; else timeB0, i = 0; who0, i = a; timeMax0, i = Math.Max(timeA0, i, timeB0, i); if (a0 = b0) least0 = a0; tempRlt0 = a; else least0 = b0; tempRlt0 = b; result0 = new String(tempRlt); for (int k = 1; k n; k+) int tempSum = 0; for (in

9、t temp = 0; temp = k; temp+) tempSum += atemp; for (int i = 0; i = tempSum; i+) timeAk, i = i; if (i ak) timeBk, i = timeBk - 1, i + bk; whok, i = b; else if (timeBk - 1, i + bk) = timeBk - 1, i - ak) timeBk, i = timeBk - 1, i + bk; whok, i = b; else timeBk, i = timeBk - 1, i - ak; whok, i = a; time

10、Maxk, i = Math.Max(timeAk, i, timeBk, i); for (int i = tempSum + 1; i aSum; i+) timeAk, i = tempSum; timeBk, i = 0; int flag = 0; for (int i = 0; i 0 & timeMaxk, i 0 & flag 0; i-) if (tempRlti = a) flag -= ai; tempRlti - 1 = whoi - 1, flag; if (tempRlti = b) tempRlti - 1 = whoi - 1, flag; resultk =

11、new String(tempRlt); static void Main(string args) const int N = 6; int a = new intN 2, 5, 7, 10, 5, 2 ; int b = new intN 3, 8, 4, 11, 3, 4 ; int least = new intN; string result = new stringN; DlrwZydd(a, b, N, least, result); Console.WriteLine(); for (int i = 0; i N; i+) Console.WriteLine( 按要求完成前0项

12、任务的机器顺序为: + resulti + 时间为:1 ,i+1,leasti); 实验三 贪心算法一、实验目的1进一步理解算法设计的基本步骤及各步的主要内容、基本要求2加深对贪婪法算法设计方法的理解与应用3掌握将算法转化为计算机上机程序的方法4培养学生应用所学知识解决实际问题的能力。二、实验内容1、设有n个顾客同时等待一项服务。顾客i需要的服务时间为ti,1=iN,则不可能到达终点; 加油站间的距离相等,即i=aj=LN,则加油次数k=n/N(n%N=0)或k=n/N+1(n%N!=0); 加油站间的距离不相等,即i!=aj,则加油次数k通过下面的算法求解。五、实验结果分析最优服务次序问题:

13、时间复杂度为O(nlogn)汽车加油问题:时间复杂度为O(n)。六、实验体会七、附录:(源代码)汽车加油问题:#include #includenamespace ConsoleApplication1 class Program static void Main(string args) Console.Write(请输入汽车加满油后可行驶路程: ); int n = Convert.ToInt32(Console.ReadLine(); Console.Write(请输入途经加油站总数: ); int k = Convert.ToInt32(Console.ReadLine(); int

14、distance = new intk + 1;/加油站间距 int note = new intk;/记录加油站点 Console.WriteLine(请输入加油站间距!); for (int i = 0; i = 0) if (count = 0) Console.WriteLine(汽车不用加油就可到达终点!); else Console.WriteLine(汽车在旅途中需加0次油!, count); Console.WriteLine(分别在以下加油站加了油:); for (int i = 0; i note.Length; i+) if (notei != 0) /输出需加油站点 C

15、onsole.WriteLine(第 + notei + 个加油站!); else Console.WriteLine(汽车无法到达终点!); Console.ReadKey(); class Problem public int Greedy(int d, int note, int n) int i, j, s, add = 0, p = 0, k = d.Length; for (i = 0; i n) /不能到达目的地 return -1; for (j = 0, s = 0; j n) /需要加油 add+; notep+ = j;s = dj;return add;实验四 回溯法一

16、、实验目的1掌握能用回溯法求解的问题应满足的条件;2加深对回溯法算法设计方法的理解与应用;3锻炼学生对程序跟踪调试能力;4通过本次实验的练习培养学生应用所学知识解决实际问题的能力。二、实验内容1、设某一机器由n个部件组成,每一种部件都可以从m个不同的供应商处购得。设wij是从供应商j处购得的部件i的重量,cij是相应的价格。试设计一个算法,给出总价格不超过c的最小重量机器设计。2、设有n 件工作分配给n 个人。将工作i 分配给第j 个人所需的费用为cij。试设计一个算法,为每一个人都分配1 件不同的工作,并使总费用达到最小。三、实验要求(1)用回溯法算法设计方法求解最小重量机器设计问题和工作分

17、配问题;(2)上机实现所设计的算法;(3)分析所设计的算法的时间/空间复杂性。四、实验过程设计(算法设计过程)1、a.部件有n个,供应商有m个,分别用wij和cij存储从供应商j 处购得的部件i的重量和相应价格,d为总价格的上限。 b.用递归函数backtrack(i)来实现回溯法搜索排列树(形式参数i表示递归深度)。 若cpd,则为不可行解,剪去相应子树,返回到i-1层继续执行。 若cw=sum,则不是最优解,剪去相应子树,返回到i-1层继续执行。 若in,则算法搜索到一个叶结点,用sum对最优解进行记录,返回到i-1层继续执行; 用for循环对部件i从m个不同的供应商购得的情况进行选择(1

18、jm)。 c.主函数调用一次Knapsack(1)即可完成整个回溯搜索过程,最终得到的sum即为所求最小总重量。2、a. 用cij存储将工作i分配给第j个人所需的费用,用vj 标记第j个人是否已分配工作;b. 用递归函数backtrack (i, total)来实现回溯法搜索排列树(形式参数i表示递归深度,n用来控制递归深度,形式参数total表示当前总费用,s表示当前最优总费用): 若total=s,则不是最优解,剪去相应子树,返回到i-1层继续执行; 若i n,则算法搜索到一个叶结点,用s对最优解进行记录,返回到i-1层继续执行; 采用for循环针对n个人对工作i进行分配(1jn):1 若

19、vj=1 ,则第j个人已分配了工作,找第j+1个人进行分配;2 若vj=0,则将工作i分配给第j个人(即vj=1 ),对工作i+1调用递归函数backtrack(i+1,total+cij)继续进行分配;3 函数backtrack(i+1,total+cij)调用结束后则返回vj=0,将工作i对第j+1个人进行分配;4 当jn时,for循环结束; 当i=1时,若已测试完cij的所有可选值,外层调用就全部结束;c. 主函数调用一次backtrack(1,0)即可完成整个回溯搜索过程,最终得到的s即为所求最小总费用。五、实验结果分析最小重量机器设计问题:程序中最大的循环出现在递归函数backtra

20、ck(i)中,而此函数遍历排列树的时间复杂度为O(n!),故该算法的时间复杂度为O(n!)。工作分配问题:递归函数backtrack(i,total)遍历排列树的时间复杂度为O(n!),主函数调用递归函数backtrack(1,0),故该算法的时间复杂度为O(n!)。六、实验体会七、附录:(源代码)最小重量机器设计问题:#include #define N 1000 using namespace std; int n,m,d,cp=0,cw=0,sum=0; int cNN,wNN; void backtrack(int i) if(in) if(cwsum) sum = cw; return ; for(int j=1;j=m;j+) cw+=wij; cp+=cij; if(cwsum & cpnmd; for(int i=1;i=n;i+) for(int j=1;jcij; sum+=ci1; for(int k=1;k=n;k+) for(int j=1;jwkj; backtrack(1); coutsumendl; system(pause); return 0;

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1