欢迎来到冰豆网! | 帮助中心 分享价值,成长自我!
冰豆网
全部分类
  • IT计算机>
  • 经管营销>
  • 医药卫生>
  • 自然科学>
  • 农林牧渔>
  • 人文社科>
  • 工程科技>
  • PPT模板>
  • 求职职场>
  • 解决方案>
  • 总结汇报>
  • 党团工作>
  • ImageVerifierCode 换一换
    首页 冰豆网 > 资源分类 > DOCX文档下载
    分享到微信 分享到微博 分享到QQ空间

    昆明理工大学 算法分析与设计 实验3.docx

    • 资源ID:12645350       资源大小:153.51KB        全文页数:15页
    • 资源格式: DOCX        下载积分:10金币
    快捷下载 游客一键下载
    账号登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录 QQ登录
    二维码
    微信扫一扫登录
    下载资源需要10金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP,免费下载
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    昆明理工大学 算法分析与设计 实验3.docx

    1、昆明理工大学 算法分析与设计 实验3昆明理工大学信息工程与自动化学院学生实验报告( 2014 2015 学年 第 1 学期 )课程名称:算法设计与分析 开课实验室:信自楼445 2014 年12月17日年级、专业、班计科122班学号201210405204姓名邹华宇成绩实验项目名称最大子段和问题指导教师吴晟教师评语该同学是否了解实验原理: A.了解 B.基本了解 C.不了解该同学的实验能力: A.强 B.中等 C.差 该同学的实验是否达到要求: A.达到 B.基本达到 C.未达到实验报告是否规范: A.规范 B.基本规范 C.不规范实验过程是否详细记录: A.详细 B.一般 C.没有 教师签名

    2、: 年 月 日一、上机目的及内容1.上机内容给定有n个整数(可能有负整数)组成的序列(a1,a2,an),求改序列形如的子段和的最大值,当所有整数均为负整数时,其最大子段和为0。2.上机目的(1)复习数据结构课程的相关知识,实现课程间的平滑过渡;(2)掌握并应用算法的数学分析和后验分析方法;(3)理解这样一个观点:不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。二、实验原理及基本技术路线图(方框原理图或程序流程图)(1)分别用穷举法、分治法和动态规划法设计最大子段和问题的算法;穷举法(蛮力法)设计原理:利用3个for的嵌套(实现从第1个数开始计算子段长度为1

    3、,2,3n的子段和,同理计算出第2个数开始的长度为1,2,3n-1的子段和,依次类推到第n个数开始计算的长为1的子段和)和一个if(用来比较大小),将其所有子段的和计算出来并将最大子段和赋值给summax1。用了3个for嵌套所以时间复杂性为;穷举法(蛮力法)流程图:分治法设计原理:1)划分:按照平衡子问题的原则,将序列划分成长度相同的两个字序列和。2)求解子问题:对于划分阶段的情况分别的两段可用递归求解,如果最大子段和在两端之间需要分别计算,则为最大子段和。若然只在左边或右边,那就好办了,前者视为summax1,后者视为summax2。3)合并:比较在划分阶段的3种情况下的最大子段和,取三者

    4、之中的较大者为原问题的解。4)时间复杂性分析:,最后为。分治法设计流程图:动态规划法设计原理:(关键是要确定动态规划函数。)记则由的定义,当是,否则,。时间复杂性为:。动态规划法流程图:(2)对所设计的算法采用大O符号进行时间复杂性分析;蛮力法:T(n)=O(n3);分治法:T(n)=O(nlog(n);动态规划法:T(n)=O(n)。(3)上机实现算法,并用计数法和计时法分别测算算法的运行时间;(4)通过分析对比,得出自己的结论。结论:穷举法只可以处理小理的数据。当数据量超过10000时,由穷举法要等很久才输出,所以数据量超过10000时,就比较分治法和动态规划法。由实验结果可知,动态规划法

    5、所用的时间要少。三、所用仪器、材料(设备名称、型号、规格等或使用软件)1台PC及VISUAL C+6.0软件四、实验方法、步骤(或:程序代码或操作过程) 部分重要代码说明:#include /时间的头文件#include /数学头文件int getMaxSum1(int iarray, int n)/*蛮力法函数 */int getMaxSum2(int iarray, int startIndex, int endIndex)/分治法函数int getMaxSum3(int iarray, int n)/*动态规划方法函数 */int OUT_PRINTF()/输出最大字段求解的函数int

    6、main()/主函数程序源代码:#include #include /时间的头文件#include /数学头文件using namespace std;/*蛮力法 */int getMaxSum1(int iarray, int n)int maxSum = 0;/初始化maxSumfor (int i = 0; i n; +i)/实现从第1个数开始计算子段长度为1,2,3n的子段和 for (int j = i; j n; +j) int tmp = 0;/初始化tmp(子段和) for (int k = i; k maxSum )/比较子段和,得出最大的子段和maxSum maxSum =

    7、 tmp; return maxSum;/*分治递归方法 */int getMaxSum2(int iarray, int startIndex, int endIndex) if ( endIndex = startIndex ) /只有一个元素 return iarraystartIndex; if ( endIndex - startIndex = 1 )/两个元素时 int tmp = iarraystartIndex + iarrayendIndex; tmp = tmp iarraystartIndex ? tmp : iarraystartIndex; tmp = tmp iar

    8、rayendIndex ? tmp : iarrayendIndex; return tmp; /左边一半序列的最大子段和leftMaxSumint leftMaxSum = getMaxSum2(iarray, startIndex, (startIndex + endIndex)/2); /右边一半序列的最大子段和rightMaxSum int rightMaxSum = getMaxSum2(iarray, (startIndex + endIndex)/2+1, endIndex);int s1 = 0;int s2 = 0;int tmp = 0; for (int i = (sta

    9、rtIndex + endIndex)/2; i = startIndex; -i)/左子段和 tmp = tmp + iarrayi; if ( tmp s1 ) s1 = tmp; tmp = 0; for ( i = (startIndex + endIndex)/2+1; i s2 ) s2 = tmp; int middleMaxSum = s1 + s2; int maxSum = leftMaxSum rightMaxSum ? leftMaxSum : rightMaxSum; maxSum = maxSum middleMaxSum ? maxSum : middleMaxS

    10、um; return maxSum;/*动态规划方法 */int getMaxSum3(int iarray, int n) int maxSum = 0; int b = 0; for (int i = 0; i 0 ) b = b + iarrayi; else b = iarrayi; if ( b maxSum ) maxSum = b; return maxSum;int OUT_PRINTF()/输出最大字段求解的函数 int n,i,cho; clock_t t1,t2,t3,t4,t5,t6; cout求最大字段和问题n; coutendl; coutcho; cout请输入序

    11、列的长度n; int *iarray=new intn; if(cho=2) srand( (unsigned)time( NULL ) ); / cout随机序列为:endl; for(i=1;i=n;i+) iarrayi=(rand()/13-1129); /cout iarrayi; else cout请输入序列endl; for(i=0;iiarrayi; t1=clock();/使用蛮力法求解的开始时间 int maxSum1 = getMaxSum1(iarray, n); t2=clock();/蛮力法求解的结束时间 coutendl; cout-n; cout蛮力法最大子段和

    12、为: maxSum1 endl; cout时间:float(t2-t1)/CLK_TCKendl;/CLK_TCK t3=clock();/分治法求解的开始时间 int maxSum2 = getMaxSum2(iarray, 0, n-1); t4=clock();/分治法求解的结束时间 cout-n; cout分治法最大子段和为: maxSum2 endl; cout时间:float(t4-t3)/CLK_TCKendl; t5=clock();/动态规划法求解的开始时间 int maxSum3 = getMaxSum3(iarray, n); t6=clock();/动态规划法求解的结束

    13、时间 cout-n; cout动态规划法最大子段和为: maxSum3 endl; cout时间:float(t6-t5)/CLK_TCKendl; return 0; int main()/主函数 int i; char a,y,Y,b; OUT_PRINTF(); /调用输出函数 for(i=1;i10;i+) cout是否继续输入?Y/Na;if(a=y|a=Y) OUT_PRINTF(); if(a=n|a=N) return 0; return 0; 五、实验过程原始记录( 测试数据、图表、计算等)输入选择的方式求最大子段和问题。手动输入适合序列长度短的时候:当要测试序列长度很大的时

    14、候,经过测试,蛮力法的输出时间太长,所以先省去蛮力法的测试。当序列长度很大是,只调用动态规划法和分治法。结果如下:经过测试可知,动态规划法是最佳的选择。六、实验结果、分析和结论(误差分析与数据处理、成果总结等。其中,绘制曲线图时必须用计算纸或程序运行结果、改进、收获)同样的问题可以用不同的方法解决,一个好的算法是反复努力和重新修正的结果。虽然穷举法,分治法,动态规划法都可以解决最大子段和这个问题,但是这些方法的时间复杂度各不相同,时间复杂度越低,代表这个方法更优越。不同的算法能够解决相同的问题,这些算法的解题思路不同,复杂程度不同,解题效率也不同。通过这次实验,我对动态规划法有了深刻的理解,同时也对前面所学的蛮力法和分治法进行了复习,体会到算法设计技术的思想方法。 注:教师必须按照上述各项内容严格要求,认真批改和评定学生成绩。


    注意事项

    本文(昆明理工大学 算法分析与设计 实验3.docx)为本站会员主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    copyright@ 2008-2022 冰点文档网站版权所有

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

    收起
    展开