


版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、本科实验报告课程名称:分算法设计与分析实验项目:分治法合并排序贪心法作业调度动态规划法求多段图问题回溯法求n 皇后问题实验地点:行勉楼 B209专业班级:软件14* 班学号: 201400*学生姓名:*指导教师:*2016年 4 月 10日1实验 1 分治法合并排序一、实验目的1. 掌握合并排序的基本思想2. 掌握合并排序的实现方法3. 学会分析算法的时间复杂度4. 学会用分治法解决实际问题二、实验内容随机产生一个整型数组, 然后用合并排序将该数组做升序排列, 要求输出排序前和排序后的数组。三、实验环境Window7; 惠普笔记本;VC+6.0.四、算法描述和程序代码#include<i
2、ostream>#include<stdio.h>#include<time.h>using namespace std;#define random(x)(rand()%x);int a10;/合并排序函数。void Merge(int left, int mid, int right) int t11;int i = left, j = mid + 1, k = 0;while (i <= mid) && (j <= right) if (ai <= aj)tk+ = ai+;elsetk+ = aj+;while (i &l
3、t;= mid)tk+ = ai+;while (j <= right)tk+ = aj+;for (i = 0, k = left; k <= right;)ak+ = ti+;/分划函数,并且调用合并函数。void MergeSort(int left, int right) if (left < right) int mid = (left + right) / 2);MergeSort(left, mid);2MergeSort(mid + 1, right);Merge(left, mid, right);/调用合并函数。void main() int i;cout
4、 << "排序前的数组为:"for (i = 0; i < 10; i+) ai = random(100); /调用 random 函数,产生10 个 0-100 的随机数。cout << ai << " "cout << endl;MergeSort(0, 9);cout << "排序后的数组为:"for (i = 0; i < 10; i+) cout << ai << " "getchar();五、实验结果截图六
5、、实验总结分治算法是很有用的算法,分治法的设计一般是递归的。两路合并排序是一个典型的分治算法,其基本运算为元素比较,最坏情况下的时间为W(n)=O(nlogn) ,在排序过程中需要使用与原序列相同长度的辅助数组temp,因此它所需的额外空间为O(n)。通过编写代码,我很好的掌握了分治法的步骤:划分;求解子问题;合并。对“分治策略”有了更深的体会,它将原问题划分为彼此独立的、规模较小而结构相同的子问题。3实验 2 贪心法作业调度一、实验目的1. 掌握贪心算法的基本思想2. 掌握贪心算法的典型问题求解3. 进一步多级调度的基本思想和算法设计方法4. 学会用贪心法分析和解决实际问题二、实验内容设计贪
6、心算法实现作业调度,要求按作业调度顺序输出作业序列。如已知n=8 ,效益p=(35, 30, 25, 20, 15, 10, 5, 1) ,时间期限d=(4, 2, 4, 5, 6, 4, 5, 7) ,求该条件下的最大效益。三、实验环境Window7; 惠普笔记本;VC+6.0.四、算法描述和程序代码#include <iostream>using namespace std;const int Work8 = 35,30,25,20,15,10,5,1 ;/所有作业按收益从大到小排序const int maxTime8 = 4,2,4,5,6,4,5,7 ;class Home
7、Work private:int res8;bool flag8;int maxReap;public:void dealWith() / 遍历所有作业:int i;for (i = 0; i<8; i+) int Time = maxTimei - 1;if (!flagTime) / 如果最大期限那一天还未安排作业, 则将当前作业安排在所允许的最大期限那天resTime = Worki;flagTime = true;else / 如果当前作业所允许的最大期限那一天已经安排的其他作业, 就向前搜索空位 , 将该作业安排进去for (int j = Time - 1; j >=
8、0; j-)4if (!flagj) resj = Worki;flagj = true;break;cout << "作业完成顺序为:" ;for (i = 0; i<7; i+) cout << resi << "t"cout << endl;cout << endl << "最佳效益为 :"int j;for (j = 0; j<7; j+)maxReap += resj;cout << maxReap << endl;H
9、omeWork()int i;for(i = 0;i<8;i+)flagi = false;maxReap = 0;void main() HomeWork a = HomeWork();a.dealWith();getchar();五、实验结果截图六、实验总结通过实验编写代码使得我对应用贪心法求解问题有了很大的提高。贪心法是一种求解组合优化问题的算法设计技术,其求解过程由一些列决策构成。贪心算法的关键在于贪心策略,两要素是: 最优子结构和贪心策略,对带时限的作业进行排序是一个典型的贪心算法,在本次实验中我使用了改进后的可行解判定方法来解决这个问题,使算法的时间从 (n 2 )减少到接近
10、 O(n) 。5实验 3 动态规划法求多段图问题一、实验目的1. 掌握动态规划算法的基本思想2. 掌握多段图的动态规划算法3. 选择邻接表或邻接矩阵方式来存储图4. 分析算法求解的复杂度二、实验内容设 G=(V,E) 是一个带权有向图,其顶点的集合V 被划分成k>2 个不相交的子集Vi ,1<i<=k ,其中 V1 和 Vk 分别只有一个顶点 s(源)和一个顶点 t(汇)。图中所有边的始点和终点都在相邻的两个子集 Vi 和 Vi+1 中。求一条 s 到 t 的最短路线。 参考课本 P124 图 7-1 中的多段图,试选择使用向前递推算法或向后递推算法求解多段图问题。三、实验环
11、境Window7; 惠普笔记本;VC+6.0.四、算法描述和程序代码#include<iostream>using namespace std;structint r50;int length;SqList, L;void MSort(int SR, int TR1, int s, int t);6void Merge(int sR, int TR, int i, int mid, int n);void main()cout << " 请输入待排序的数目:"cin >> L.length;cout << " 请输入
12、待排序的数:"for (int c = 0; c<L.length; c+)cin >> L.rc;cout << " 合并排序前的数组为:"for (int d = 0; d<L.length; d+)cout << L.rd << " "cout << endl;MSort(L.r, L.r, 0, L.length - 1);cout << " 合并排序后的数组为:"for (int i3 = 0; i3<L.length; i3
13、+)cout << L.ri3 << " "cout << endl;void MSort(int SR, int TR1, int s, int t) /两路合并排序int mid;int TR2100;if (s = t)TR1s = SRs;else /若序列的长度超过1,则划分为两个子序列mid = (s + t) / 2; / 将待排序的序列一分为二MSort(SR, TR2, s, mid); / 对左子序列排序MSort(SR, TR2, mid + 1, t); / 对右子序列排序Merge(TR2, TR1, s, mi
14、d, t); / 将两个有序子序列合并成一个有序序列void Merge(int SR, int TR, int i, int mid, int n)/将两个有序序列合并成一个有序序列int j, k;for (j = mid + 1, k = i; i <= mid&&j <= n; +k)if (SRi <= SRj)TRk = SRi+;elseTRk = SRj+;if (i <= mid) / 如果左子序列还有元素未输出,则将左子序列剩余元素依次输出7int k1 = k;for (int i1 = i; i1 <= mid; i1+)T
15、Rk1 = SRi1;k1+;if (j <= n) / 如果右子序列还有元素未输出,则将右子序列剩余元素依次输出int k2 = k;for (int j2 = j; j2 <= n; j2+)TRk2 = SRj2;k2+;五、实验结果截图六、实验总结通过这次实验使得我对应用动态规划法求解问题有了很大的提高。动态规划算法将原问题归约为规模较小、 结构相同的子问题,建立原问题与子问题优化函数间的依赖关系,从规模较小的子问题开始,利用上述依赖关系求解规模更大的子问题,直到得到原始问题的解为止。采用逐步向前递推的方式,由子问题的最优解来计算原问题的最优解。算法所用空间除邻接矩阵和最优
16、解 path 以外,还需要长度为 n 的 cost 和 d 两个局部以为数组。这一算法的时间分析与 DFS 和 BFS 相似,总的执行时间为 (n)8实验 4 回溯法求 n 皇后问题一、实验目的1. 掌握回溯算法的基本思想2. 通过 n 皇后问题求解熟悉回溯法3. 使用蒙特卡洛方法分析算法的复杂度二、实验内容要求在一个 8*8 的棋盘上放置 8 个皇后,使得它们彼此不受“攻击” 。两个皇后位于棋盘上的同一行、 同一列或同一对角线上, 则称它们在互相攻击。 现在要找出使得棋盘上 8 个皇后互不攻击的布局。三、实验环境Window7; 惠普笔记本;VC+6.0.四、算法描述和程序代码#includ
17、e<iostream>using namespace std;#define N 8int res1008;int countRes = 0;bool Place(int k,int i,int *x)for(int j = 0;j<k;j+)if(xj = i | abs(xj-i) = abs(j-k)return false;return true;void NQueen(int k,int n,int *x)for(int i = 0;i<n;i+)if(Place(k,i,x)xk = i;if(k = n-1) for (i = 0; i < n; i
18、+)rescountResi = xi;cout << xi << "t"countRes+;cout << endl;elseNQueen(k+1,n,x);9void NQueen(int n,int *x)NQueen(0,n,x);int main()int xN;for(int i = 0;i<N;i+)*(x+i) = -10;NQueen(N,x);cout<<endl<<"共 "<<countRes<<" 种解 "<<endl;char show;cout<<"是否显示图示 ?(Y/N)"<<endl;cin>>show;if(show = 'Y' | show = 'y')for(int n = 0;n<countRes;n+)cout<<"第 "<<n+1<<" 个解 :"<<endl;for(int i = 0;i<N;i+)for(int j = 0;j<N;j+)if(resni = j)co
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 苯基氯硅烷生产工操作评估测试考核试卷含答案
- 灯具店灯饰知识培训课件
- 灯丝灯知识培训课件
- 滴墨课件教学课件
- 重难点解析人教版八年级上册物理《物态变化》专题训练试题(含答案及解析)
- 考点攻克人教版九年级物理《电流和电路》单元测评试卷(含答案详解版)
- 港口设施基础知识培训课件
- 出租挂从业考试卷及答案解析
- 中医护理常考题库及答案解析
- 电子大厦安全性测试题及答案解析
- 股权质押合同范本及股权质押期限约定
- 2025年放射工作人员放射防护培训考试题及答案
- 2024年发展对象培训结业考试真题
- 渔民补贴资金管理办法
- 顺丰快递物流模式的优势分析
- 安全用药相关管理制度
- 船员培训体系与技能提升研究-洞察阐释
- 学校工作行事历表
- 中医面瘫个案
- 健康素养促进培训课件
- 短视频时代的注意力碎片化-洞察及研究
评论
0/150
提交评论