多项式分治,背包问题,单元最短路径,克鲁斯卡尔,多段图.docxVIP

多项式分治,背包问题,单元最短路径,克鲁斯卡尔,多段图.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多项式分治,背包问题,单元最短路径,克鲁斯卡尔,多段图

算法设计与分析大作业班级:物联网1401学号:姓名:zk江南大学物联网工程学院一、多项式分治1.1算法简介分治字面上的解释是“分而治之”,就是把一个复杂的问题分成两个或更多的相同或相似的子问题,再把子问题分成更小的子问题??直到最后子问题可以简单的直接求解,原问题的解即子问题的解的合并。因为多项式的表示是Pn(x)=?anxn?+an-1xn-1+…+a1x+a0?任意大整数都可以看作是一多项式(其中X=10,an是第n+1位上的数字,个位用a0表示)。如:9876=6+7*101+8*102+9*103??所以大整数相乘可以用多项式乘积的分治算法实现,实际上大整数相乘就是多项式乘积的一个特例。?把一个多项式分为两个?P?(x)=?P0(x)+?P1(x)xn/2????q(x)=q0(x)+q1(x)xn/2???P(x)*q(x)=P0(x)*q0(x)+P1(x)*P1(x)*xn+((P0(x)+?P1(x))*(?q0(x)+q1(x))-?P0?*?q0?–?P1*?q1)*?xn/2?令:R0=?P0(x)*q0(x)????R1=?P1(x)*q1(x)? ?R2=?P0(x)+?P1(x))*(?q0(x)+q1(x))-?P0?*?q0?–?P1*?q1?于是上式可化简为P(x)*q(x)=?R0?+(R2-?R0-?R1)*?xn/2+?R1*xn?由于多项式乘法时间远多于加法时间,所以多项式乘积分治算法对比较大的n将有很大的改进。1.2调试过程①在调试过程中poly_product()函数出错,单步调试发现图1poly_product()错误部分第16,17行出错,多项式阶数相同系数相加,所以讲r2+k改为r2或17,18行r3改为r3+k即可。②多项式的输入只能是2的倍数。1.3运行结果图2多项式分治算法运行结果二、背包问题2.1算法简介背包是基于这样的问题,即有N件物品和一个容量为V的背包,第i件物品的重量是w[i],价值是v[i]。求解将哪些物品装入背包可使这些物品的重量总和不超过背包容量,且价值总和最大。问题的约束方程为:根据约束方程,最好是选择即使目标函数的值增加最快,又使背包载重消耗较慢的物体装入背包,即优先选择价值重量比最大的物体装入背包中。2.2算法复杂度时间和空间复杂度均为O(N*V),其中时间复杂度基本已经不能再优化了,但空间复杂度却可以优化到O(V)。2.3调试过程①在背包问题中首先用到merge_sort()合并排序算法对物体的价值重量比进项排序,实际运行中发现出错。单步调试发现在swap()交换函数中并没有完成交换,由于物体属性为结构体所有采用较麻烦的方法交换。void swap(OBJECT x, OBJECT y){OBJECT temp;temp.p = x.p;x.p = y.p;y.p = temp.p;temp.w = x.w;x.w = y.w;y.w = temp.w;temp.v = x.v;x.v = y.v;y.v = temp.v;}2.4运行结果图3 背包问题程序运行结果三、单源最短路径3.1算法简介Dijkstra 算法思想为:设G=(V,E)是一个带权有向图,把图中顶点集合V分成两组,第一组为已求出最短路径的顶点集合(用S表示,初始时S中只有一个源点,以后每求得一条最短路径 , 就将加入到集合S中,直到全部顶点都加入到S中,算法就结束了),第二组为其余未确定最短路径的顶点集合(用U表示),按最短路径长度的递增次序依次把第二组的顶点加入S中。在加入的过程中,总保持从源点v到S中各顶点的最短路径长度不大于从源点v到U中任何顶点的最短路径长度。此外,每个顶点对应一个距离,S中的顶点的距离就是从v到此顶点的最短路径长度,U中的顶点的距离,是从v到此顶点只包括S中的顶点为中间顶点的当前最短路径长度。其实Dijkstra 算法是一个数学问题,算法是一个贪心算法,未被确定的最短路径处在一个不断更新的过程中,已经确定的最短路径不需更新,每次都是在已经确定的最短路径的基础上获取新的最短路径。并且最先找到的最短路径越短,最后找到的最短路径越长,也就是说,确定的最短路径是一个递增的趋势。这里需要明确的一个很重要的问题就是:下一条最短路径只能有两种情况: 1. 集合A = 由已经产生的最短路径的终点再扩充一条边得到; 2. B = 由源点直接到达目的节点。3.2调试过程①又相图邻接表的建立,程序中利用循环嵌套的方式建立每个节点与相邻节点的邻接链表。思路是:图4邻接表建立思路在此之前尝试另一种建立邻接链表的方法:typedef struct VertexNode {int data;NODE *firstedge; //边表头指针}VertexNode, Adj

文档评论(0)

jiupshaieuk12 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6212135231000003

1亿VIP精品文档

相关文档