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

加入VIP,免费下载
 

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

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

下载须知

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

版权提示 | 免责声明

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

算法设计与分析大作业报告.docx

1、算法设计与分析大作业报告算法设计与分析大作业报告班级: 学号: 姓名: 分治法大作业报告问题陈述:编程实现归并排序算法和快速排序算法,输出排序结果。输入10组相同的数据,验证排序结果和完成排序的比较次数。分治法基本思想:分治法的基本思想是将问题分解成若干个子问题,然后求解子问题。子问题较原问题要容易些, 先得出子问题的解,由此得出原问题的解,这就是所谓“分而治之”的思想。算法描述: 当要求解一个输入规模为n,且n的取值相当大的问题时,如果问题可以分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1kn,而且子问题与原问题性质相同,原问题的解可由这些子问题的解合并得出。那末,对于这类问题

2、分治法是十分有效的。本实验就是通过归并排序和快速排序来体现分治的思想。 1.归并排序的思想:将A(1),A(N)分成两个集合,对每个集合单独分类,然后将已分类的两个序列归并成一个含N个元素分好类的元素2.快速排序的思想:选取A的某个元素做为划分元素,然后将其他元素重新排列,使在划分元素以前出现的元素都 小于或等于它,在划分元素之后出现的划分元素都大于等于它。程序代码:#include #include #include void MergeSort(int *data,int x,int y,int *temp) int p,q,m,i=x; if (y-x1) m = x+(y-x)/2;

3、p = x; q = m; MergeSort(data,x,m,temp); MergeSort(data,m,y,temp); while(pm|q=y|(pm&datapdataq) tempi+ = datap+; else tempi+ = dataq+; for(i=x;iy;i+) datai = tempi; void HoareSort(int *data,int x,int y) int p=x,q=y-1,temp; while(pp&dataq=datap) q-; if (qp) temp = datap,datap = dataq,dataq =temp; p+;

4、while(qp&datap=dataq) p+; if (pq) temp = datap,datap = dataq,dataq =temp; q-; if (p=q) HoareSort(data,x,p); HoareSort(data,p+1,y); int main() int data10,i; int temp10; srand(time(NULL); for (i=0;i10;i+) datai = rand()%100; printf(未排序排序的数据为:n); for (i=0;i10;i+) printf(%d ,datai); printf(n); printf(归并

5、排序的顺序为: n); MergeSort(data,0,10,temp); for (i=0;i10;i+) printf(%d ,datai); printf(n); printf(快速排序的顺序为: n); HoareSort(data,0,10); for (i=0;i10;i+) printf(%d ,datai); printf(n); return 0;运行结果:结论分析:归并排序和快速排序都是递归排序,但是归并排序是稳定的排序方法,快速排序是不稳定的排序方法。(1)此问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; (2)利用该问题分解出的子问题的解可以合并

6、为该问题的解; (3)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。动态规划大作业报告问题陈述: 定义0-1背包问题为:。限制条件为:,且。和分别表示第i个物品的价值和重量,c为背包容量。动态规划基本思想: 动态规划算法通常用于求解具有某种最优性质的问题。在这类问题中,可能会有许多可行解。每一个解都对应于一个值,我们希望找到具有最优值的解。动态规划算法与分治法类似,其基本思想也是将待求解问题分解成若干个子问题,先求解子问题,然后从这些子问题的解得到原问题的解。与分治法不同的是,适合于用动态规划求解的问题,经分解得到子问题往往不是互相独立的。若用分治法来解这类问题,则分

7、解得到的子问题数目太多,有些子问题被重复计算了很多次。如果我们能够保存已解决的子问题的答案,而在需要时再找出已求得的答案,这样就可以避免大量的重复计算,节省时间。我们可以用一个表来记录所有已解的子问题的答案。不管该子问题以后是否被用到,只要它被计算过,就将其结果填入表中。这就是动态规划法的基本思路。具体的动态规划算法多种多样,但它们具有相同的填表格式。算法描述: 刻画0-1背包问题的最优解的结构。可以将背包问题的求解过程看作是进行一系列的决策过程,即决定哪些物品应该放入背包,哪些物品不放入背包。如果一个问题的最优解包含了物品n,即xn=1,那么其余x1,x2,.,x(n-1)一定构成子问题1,

8、2,.,n-1在容量W-wn时的最优解。如果这个最优解不包含物品n,即xn=0,那么其余x1,x2,.,x(n-1)一定构成子问题1,2,.,n-1在容量W时的最优解。递归定义最优解的值,根据上述分析的最优解的结构递归地定义问题最优解。设ci,w表示背包容量为w时,i个物品导致的最优解的总价值,得到下式。显然要求cn,w。程序代码:#include using namespace std;void Path(int n, int W, int c100, int *v, int *wei) memset(*c, 0, (W+1)*sizeof(int); for (int i = 1; i =

9、 n; i+) ci0 = 0; for (int w = 1; w w) ciw = ci-1w; else int temp = ci-1w-weii-1 + vi-1; if (ci-1w temp) ciw = ci-1w; else ciw = temp; void find(int c100, int *x, int *wei, int n, int W) int w = W; for (int i = n; i = 2; i-) if (ciw = ci-1w) xi-1 = 0; else xi-1 = 1; w = w - weii-1; if (c1w = 0) x0 =

10、0; else x0 = 1;int main() int n = 5; int W = 100; int w = 10,48,35,23,25,30; int v = 40,10,20,30,50; int c6100 = 0; Path(n, W, c, v, w); cout最优的总价值为:; coutc6100endl; int x5; find(c, x, w, n, W); cout用0表示不装入,1表示装入,情况如下:endl; for (int i = 1; i n+1; i+) cout第i件物品的装入状态为:; coutxi endl; return 0;运行结果:结论分析

11、:上述代码的时间复杂度为O(nw)。能表示出装入或者不装入但计算出装入后的总价值有点问题,程序还不够完善有待改进。动态规划问题的的实质就是寻求一个最优解的过程, 实质就是为问题寻求一个 最优算法,这个最优算法解出来的值是运用所有算法中最接近实际值的解。 一般对一个问题,不会运用多种算法,而只会选取其中的一种来求解(但实际 问题中常常需要不同算法的结合,不过一般是处理不同方面的算法) 不同的算法对待不同的问题总是有利有弊。贪心法大作业报告问题陈述: 给定n种物品和一个背包.物品i的重量是Wi,其价值为Vi,背包的容量为C。在选择物品i装入背包时,可以选择物品i的一部分,1= i =n。问应如何选

12、择装入背包中的物品,使得装入背包中物品的总价值最大。贪心法基本思想:贪心算法的基本思想是找出整体当中每个小的局部的最优解,并且将所有的这些局部最优解合起来形成整体上的一个最优解。因此能够使用贪心算法的问题必须满足下面的两个性质:1.整体的最优解可以通过局部的最优解来求出;2.一个整体能够被分为多个局部,并且这些局部都能够求出最优解。使用贪心算法当中的两个典型问题是活动安排问题和背包问题。算法描述:对于背包问题,若它的一个最优解包含物品j,则从该最优解中拿出所含的物品j的那部分重量w,剩余的将是n-1个原重物品1,2,j-1,j+1,n及重为Wj-W的物品j中可装入容量为c-w的背包且具有最大价

13、值的物品。程序代码:#include struct goodinfo float p; float w; float X; int flag; ;void Insertionsort(goodinfo goods,int n) int j,i; for(j=2;jgoodsi.p) goodsi+1=goodsi; i-; goodsi+1=goods0; void bag(goodinfo goods,float M,int n) float cu; int i,j; for(i=1;i=n;i+) goodsi.X=0; cu=M; for(i=1;icu) break; goodsi.X

14、=1; cu=cu-goodsi.w; if(i=n) goodsi.X=cu/goodsi.w; for(j=2;j=n;j+) goods0=goodsj; i=j-1; while (goods0.flaggoodsi.flag) goodsi+1=goodsi; i-; goodsi+1=goods0; cout最优解为:endl; for(i=1;i=n;i+) cout第i件物品要放:; coutgoodsi.Xendl;void main() cout运用贪心法解背包问题endl; int j; int n; float M; goodinfo *goods; while(j)

15、coutn; goods=new struct goodinfo n+1; coutM; coutendl; int i; for(i=1;i=n;i+) goodsi.flag=i; cout请输入第igoodsi.w; cout请输入第igoodsi.p; goodsi.p=goodsi.p/goodsi.w; coutendl; Insertionsort(goods,n); bag(goods,M,n); cout请问您还要继续运行此程序吗?请用Y或者N回答。j; if(j=N) break;运行结果:结论分析:程序较完整,算法复杂度为O(N*N)。但有一点点小小的不足并没有算出物品装

16、入后的重量,也没有展示最优解的价值为多少。回溯法大作业报告问题陈述: 在nn格的棋盘上放置彼此不受攻击的n个皇后按照国际象棋的规则,皇后可以攻击与之处在同一行或同一列或同一斜线上的棋子。要求在nn格的棋盘上放置n个皇后,任何2个皇后不放在同一行或同一列或同一斜线上。回溯法基本思想:从一条路往前走,能进则进,不能进则退回来,换一条路再试。当我们遇到某一类问题时,它的问题可以分解,但是又不能得出明确的动态规划或是递归解法,此时可以考虑用回溯法解决此类问题。回溯法的优点在于其程序结构明确,可读性强,易于理解,而且通过对问题的分析可以大大提高运行效率。但是,对于可以得出明显的递推公式迭代求解的问题,还

17、是不要用回溯法,因为它花费的时间比较长。算法描述:解向量:(x1, x2, , xn)显约束:xi = 1,2, ,n隐约束: 1)不同列:xi != xj 2)不处于同一正、反对角线:|i-j| != |x(i)-x(j)|解空间:满N叉树程序代码:#include #include using namespace std; class queen struct q_place int x; int y; q_place () : x(0),y(0) ; public: queen(int qc) : q_count (qc), sum_solution (0) curr_solution.

18、resize (q_count); void backtrack () _backtrack (0); private: void _backtrack (int t) if (t = q_count) + sum_solution ; for (size_t i = 0;i curr_solution.size(); + i) cout x = curr_solutioni.x y = curr_solutioni.y endl; cout 解决方案有 sum_solution 个 endl; else for (int i = 0;i q_count; + i) curr_solution

19、t.x = i; curr_solutiont.y = t; if (_place(t) _backtrack (t + 1); bool _place (int k) for (int i = 0; i k; + i) if (abs(curr_solutioni.x - curr_solutionk.x) = abs(curr_solutioni.y - curr_solutionk.y) | curr_solutioni.x = curr_solutionk.x) return false; return true; private: vector curr_solution; cons

20、t int q_count; int sum_solution; ; int main() int i; cout请输入皇后的个数:i; queen q(i); cout各个皇后在不同位置时,对应的解决方案个数如下:endl; q.backtrack (); return 0; 运行结果:结论分析:n后问题主要在于可行解,一个一个的试,(t)能走通就往(t+1)下走,走不通就倒回去(t-1)换条走,再不行再回走。就要不停的尝试,不停的回溯,直到找全可行解,或者一个也没有就停止。还有重要的事约束条件,两个皇后不能在同行同列或者斜线上。这题需要理解程序设计的顺序结构基本思想,掌握顺序结构语句特点。并且学会用算法分析问题,能够使用顺序结构编写简单的程序解决具体问题。

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

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