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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算法实验报告.docx

1、算法实验报告实验名称:分治法合并排序实验时间:2017.3.24实验目的和要求:1. 掌握合并排序的基本思想2. 掌握合并排序的实现方法3. 学会分析算法的时间复杂度4. 学会用分治法解决实际问题实验内容和原理:随机产生一个整型数组,然后用合并排序将该数组做升序排列,要求输出排序前和排序后的数组。主要仪器设备:名称:Inspiron 15 7000系列(游匣7000)(湛黑)编译器:Visual Studio Community2015系统:win8.0上机调试修改源程序:#include stdafx.h#includeiostreamusing namespace std;void Mer

2、ge(int* l,int*temp,int left,int mid, int right)int k=0; int i = left, j = mid + 1; /避免重复比较lmid mid = (left + right) / 2; while (i = mid) & (j = right) /数组l(mid,right与数组l(mid,right均没有全部归入数组temp中去 if (li = lj) /将较小的数放入中间数组 tempk+ = li+; else tempk+ = lj+; while (i = mid) /表示数组l(mid,right已经全部归入temp数组中去

3、了,而数组lleft,right还有剩余 /将数组lleft,right剩下的值,逐一归入数组temp tempk+ = li+; while (j = right) tempk+ = lj+;for (i = 0; i k; i+) /将归并后的数组的值逐一赋给数组lleft,right lleft+i = tempi;void Mergesort(int*l,int*temp,int left, int right) /分化函数并调用合并函数if (left right) int mid=(left+right)/2; Mergesort(l,temp,left, mid); /左边有序

4、Mergesort(l,temp,mid+1, right); /右边有序 Merge(l,temp,left, mid,right); /再将两个有序序列合并int main()int Length; cout Length; int *l = new intLength; /新建数组 cout 产生的随机数组为: endl; for (int i = 0; i Length; i+) li = (rand() % (100 - 0 + 1) + 0; /调用随机函数产生0-100的随机数 cout li ; ;if (int i = Length) cout endl; int * p =

5、 new intLength; Mergesort(l,p,0, Length -1); cout 排序后的数组为: endl; for (int t = 0; t Length; t+) cout lt “”;cout endl; deletep; return 0;实验结果与分析。分析:二路合并排序是分治算法。它将一个序列分解成两个长度几乎相等的子序列,对它们分别排序,然后调用merge函数合并成一个有序子序列。基本运算是元素比较,时间复杂度O(nlogn)。使用与原序列相同长度的辅助数组temp,所需额外空间O(n)讨论,心得(可选):能够掌握分治法的步骤,划分,求解子问题,合并。对分治

6、问题有了更深的体会。它是将原问题划分为彼此相互独立,规模较小可求解的子问题。实验名称:贪心法作业调度实验时间:2017.3.31实验目的和要求:1. 掌握贪心算法的基本思想2. 掌握贪心算法的典型问题求解3. 进一步多机调度的基本思想和算法设计方法4. 学会用贪心法分析和解决实际问题实验内容和原理:设计贪心算法实现作业调度,要求按作业调度顺序输出作业序列。如已知要处理的作业数n=8,作业完成的期限为d=(4,2,4,5,6,4,5,7),其效益值自行给定,求该条件下的最大效益。主要仪器设备:名称:Inspiron 15 7000系列(游匣7000)(湛黑)编译器:Visual Studio C

7、ommunity2015系统:win8.0上机调试修改源程序:#include stdafx.h#includeiostream#define n 8using namespace std;void display(int*x, int*p, int*d) /输出函数 int t; for (t= 0; tn; t+) if (t+1) % 4 = 0) /每行4组 cout 【xt 】(pxt,dxt) endl; else cout 【xt 】(pxt,dxt),; int main() int dn = 4,2,4,5,6,4,5,7; /时限 int pn = 1,3,5,7,2,4,

8、6,8;/效益值 int xn = 0,1,2,3,4,5,6,7; /序号 int timen = -1,-1,-1,-1,-1,-1,-1,-1; int i, j; /虚时间片初始都空 cout 初始数据 【序号】(效益值, 时限): endl; display(x, p, d); /*效益值非递增排序函数*/int t1, t2; for (i = 0; in; i+)/冒泡排序 for (j = 0; j pj) t1 = pj + 1; pj + 1 = pj; pj = t1;/效益值新排序 t2 = xj + 1; xj + 1 = xj; xj = t2;/序号新排序 cou

9、t 排序后数据【序号】(效益值, 时限): endl; display(x, p, d); /*FJS(引入虚时间片数组time)*/ cout 作业可行解是:X=(; int W = 0;/初始效益值是0 for (i = 0; i = 0; j-)/若非空则向前寻找 if (timej=-1) W += pi;/求最大效益值 timej=xi;/标记时间片非空 cout xi ;/输出序号 break; /一旦找到满足的位置就输出并退出循环 /找不到就不输出 cout ) endl; cout 作业的调度顺序是:X=(; for (i = 0; i n; i+) if(timei!=-1)

10、cout timei ; cout )endl; cout 效益值最大是:W2个不相交的子集Vi,1i=k,其中V1和Vk分别只有一个顶点s(源)和一个顶点t(汇)。图中所有边的始点和终点都在相邻的两个子集Vi和Vi+1中。求一条s到t的最短路线。参考讲义p136图5-24中的多段图,试选择使用向前递推算法或向后递推算法求解多段图问题。主要仪器设备:名称:Inspiron 15 7000系列(游匣7000)(湛黑)编译器:Visual Studio Community2015系统:win8.0上机调试修改源程序:#includestdafx.h#includelimits.h#includei

11、ostreamusing namespace std;void Init_Graph(int N, int k, int* S, int *C) int X; int i, j; int temp = N; cout 输入边的长度:输入1 2 4 表示点1 与 2的边的长度为 4:首数字为0表示结束输入 i; while (i != 0) cin j; cin Cij; cin i; cout 输入每个阶段有哪些点:输入:X 1 2 3表示该阶段有X个点,分别为1,2,3: endl; for (i = 1; i = k; i+) cout 输入第 i X; cout 这些点分别为:; for

12、 (j = 0; j Sij; void Plan(int N, int k, int *S, int *F, int* C, int *result) int i, j, t = N; int m; int point; /coutSk0= 1; i-)/阶段 j = 0;/i阶段的状态 while (Sij != 0)/状态 m = 0;/i+1阶段的状态 Fij = INT_MAX; if (CSijpoint = INT_MAX) while (Si + 1m != 0) if (CSijSi + 1m != INT_MAX) if (Fij(Fi + 1m + CSijSi + 1m

13、) Fij = Fi + 1m + CSijSi + 1m; resultSij = Si + 1m; t-; m+; else while (Si + 1m != 0) if (Fij(Fi + 1m + CSijSi + 1m) Fij = Fi + 1m + CSijSi + 1m; resultSij = Si + 1m; t-; m+; j+; cout 符合条件的点为: endl; t = 0; resultt = 1; cout resultt ; t = resultt; while (tN) cout resultt ; t = resultt; cout endl 最短距离

14、为:; cout Fi + 10 endl;int main(int argc, char *argv) int N, k; int i, j; int *C, *S, *F;/C:边的长度,S;每个阶段的状态;F:记录每个阶段的状态中的点到终点的距离 int *result;/输出点 cout N; cout k; C = new int*N + 1; /C=(int *)malloc(sizeof(int*)*(N+1); for (i = 0; iN + 1; i+) /Ci=(int *)malloc(sizeof(int)*(N+1); Ci = new intN + 1; for

15、(j = 0; jN + 1; j+) Cij = INT_MAX; S = new int*N + 1; for (i = 0; iN + 1; i+) Si = new intN + 1; memset(Si, 0, sizeof(int)*(N + 1); F = new int *N + 1; for (i = 0; iN + 1; i+) Fi = new intN + 1; for (j = 0; jN + 1; j+) Fij = 0; result = new intN + 1; memset(result, 0, sizeof(int)*(k + 1); Init_Graph

16、(N, k, S, C); /* 多段图的动态规划方法 阶段:k 状态:Sk:即每个阶段可供选择的点的位置 决策:u 规划方程:f(k)=min(f(k+1)+边u的长度。 f(k)表示:k点到终点的最短路径长度 初始值:F(k)=0; */ Plan(N, k, S, F, C, result); deleteresult; for (i = 0; iN + 1; i+) deleteCi; deleteC; for (i = 0; iN + 1; i+) deleteSi; deleteS; for (i = 0; iN + 1; i+) deleteFi; deleteF; return

17、 0;实验结果与分析分析:算法所用空间除邻接矩阵和最优解path以外,还需要长度为n的cost和d两个局部做为数组。并不使用二维数组costi,j,而是使用一维数组costj保存j到t的最短路径长度,可以节省空间。对图G的结点按阶段顺序从0到n-1编号,向前递推按结点编号从大到小次序进行,先计算costn-1=0,再计算costn-2,cost0中保存最短路径长度。另建一维数组p保存cost0最短路径上结点,它是问题最优解。这一算法时间分析和DFS,BFS相似,时间复杂度是O(n)。讨论、心得(可选):动态规划法将原问题归约为规模较小,结构相同的子问题,建立原问题与子问题优化函数间的依赖关系,

18、从规模较小的子问题开始,利用依赖关系求解规模更大的子问题,直到得到原始问题的解为止,采用逐步向前递推的方式,由子问题最优解来计算原问题最优解。实验名称:回溯法求N皇后问题实验时间:2017.4.28实验目的和要求:1. 掌握回溯算法的基本思想2. 通过n皇后问题求解熟悉回溯法3. 使用蒙特卡洛方法分析算法的复杂度实验内容和原理:要求在一个8*8的棋盘上放置8个皇后,使得它们彼此不受“攻击”。两个皇后位于棋盘上的同一行、同一列或同一对角线上,则称它们在互相攻击。现在要找出使得棋盘上8个皇后互不攻击的布局。主要仪器设备:名称:Inspiron 15 7000系列(游匣7000)(湛黑)编译器:Vi

19、sual Studio Community2015系统:win8.0上机调试修改源程序:#include stdafx.h#includeiostreamusing namespace std;int num = 0;bool place(int k,int i,int*x)/判定两个皇后是否在同一列或同一直线 for (int t = 0; t k; t+) if (xt = i) | (abs(xt - i) = abs(t - k)return false; return true;/不在同一列或同一直线truevoid nq(int k,int n,int*x) int i; for

20、(i = 0; i n; i+)/显示约束第一种观点,xk=0,1.n-1 if (place(k, i, x)/约束函数 xk = i; if (k = n - 1) num+; cout 第 num 种: endl; cout X=( ;/输出一个可行解向量 for (i = 0; i n; i+) cout xi ; cout ) /*endl*/; if (num %3= 0)cout endl; for (i = 0; i n; i+)/输出布局,Q是皇后位置 for (int p= 0; p n; p+)/其余位置* if (p =xi)cout Q; else cout *; c

21、out endl; else nq(k + 1, n, x);/深度优先进入下一层 int main() int n = 8; int x8; cout n-皇后算法的解为: endl; nq(0, n, x); return 0;实验结果与分析向量X布局图(部分)分析:n皇后问题采用回溯法,以检查两个皇后是否冲突作为基本运算,先令x0=0,再从x1=0开始检测,如果与其他皇后发生冲突,x1再继续相加,x1=2成立。再令x2=0。如果x2=0,1,2,3都不行,就回溯到x1,依次进行此操作。该算法最坏情形O(3n*2n)=O(n(n+1)。n皇后问题有n!个叶结点,遍历时间为O(n!)讨论、心得(可选):在算法设计策略中,回溯法是比贪心法和动态规划法更一般的方法。对n皇后的知识点有了很大了解,编写和调试代码的能力有所提高。

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

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