算法分析与设计大作业
- 格式:doc
- 大小:559.00 KB
- 文档页数:6
算法分析与设计作业参考答案《算法分析与设计》作业参考答案作业⼀⼀、名词解释:1.递归算法:直接或间接地调⽤⾃⾝的算法称为递归算法。
2.程序:程序是算法⽤某种程序设计语⾔的具体实现。
⼆、简答题:1.算法需要满⾜哪些性质?简述之。
答:算法是若⼲指令的有穷序列,满⾜性质:(1)输⼊:有零个或多个外部量作为算法的输⼊。
(2)输出:算法产⽣⾄少⼀个量作为输出。
(3)确定性:组成算法的每条指令清晰、⽆歧义。
(4)有限性:算法中每条指令的执⾏次数有限,执⾏每条指令的时间也有限。
2.简要分析分治法能解决的问题具有的特征。
答:分析分治法能解决的问题主要具有如下特征:(1)该问题的规模缩⼩到⼀定的程度就可以容易地解决;(2)该问题可以分解为若⼲个规模较⼩的相同问题,即该问题具有最优⼦结构性质;(3)利⽤该问题分解出的⼦问题的解可以合并为该问题的解;(4)该问题所分解出的各个⼦问题是相互独⽴的,即⼦问题之间不包含公共的⼦问题。
3.简要分析在递归算法中消除递归调⽤,将递归算法转化为⾮递归算法的⽅法。
答:将递归算法转化为⾮递归算法的⽅法主要有:(1)采⽤⼀个⽤户定义的栈来模拟系统的递归调⽤⼯作栈。
该⽅法通⽤性强,但本质上还是递归,只不过⼈⼯做了本来由编译器做的事情,优化效果不明显。
(2)⽤递推来实现递归函数。
(3)通过Cooper 变换、反演变换能将⼀些递归转化为尾递归,从⽽迭代求出结果。
后两种⽅法在时空复杂度上均有较⼤改善,但其适⽤范围有限。
三、算法编写及算法应⽤分析题: 1.冒泡排序算法的基本运算如下: for i ←1 to n-1 dofor j ←1 to n-i do if a[j]交换a[j]、a[j+1];分析该算法的时间复杂性。
答:排序算法的基本运算步为元素⽐较,冒泡排序算法的时间复杂性就是求⽐较次数与n 的关系。
(1)设⽐较⼀次花时间1;(2)内循环次数为:n-i 次,(i=1,…n ),花时间为:∑-=-=in j i n 1)(1(3)外循环次数为:n-1,花时间为:2.设计⼀个分治算法计算⼀棵⼆叉树的⾼度。
算法分析与设计大作业班级: 12信科姓名:郭倩南学号: 1242155105完成日期: 2015-6-4指导教师:陈平序号选定题目所用算法设计技术1数字三角形问题动态规划2集合划分问题分治法回溯法3求子集问题评分:大作业报告1、数字三角形问题一、问题描述对于给定的由n行数字组成的数字三角形,计算从三角形的底至顶的路径经过的数字和的最大值。
如:73 88 1 02 7 4 44 5 2 6 5二、实验内容与实验步骤实验内容:输入数据的第1 行是数字三角形的行数n,1<=n<=100。
接下来n行是数字三角形各行中的数字。
所有数字在0..99之间实验步骤:1、首先证明该问题满足最优化原理最优化原理:一个最优化策略具有这样的性质,不论过去状态和决策如何,对前面的决策所形成的状态而言,余下的诸决策必须构成最优策略。
简而言之,一个最优化策略的子策略总是最优的。
2、建立动态规划函数3、填表三、实验环境Window7系统,vc++6.0软件四、问题分析由观察数字三角形可知,从数字三角形的顶层出发,下一层选择向左还是向右取决于两个4层数字三角形的最大数字和,而对于第四层的决定取决于第三层的最大数字和,依次类推,可知该问题是多阶段决策最优化问题,并且划分出来的子问题是相互重叠的,所以该问题采用动态规划法解决动态规划:与分治法相似,把问题分解按层次分成子问题,直到可以直接求解的子问题,然后一级一级地向上求解。
与分治法的出别在于:动态规划适用有许多重复子问题出现的问题,它保存已求出问题的解。
73 8 3 88 1 0 8 1 1 02 7 4 4 2 7 4 7 4 4 4 5 2 6 5 4 5 2 6 5 2 6 5一个五层数字三角形子问题〔1〕子问题〔2〕五、问题解决〔1〕根据对问题的分析,写出解决方法。
1、证明:S,S1,S2,..Sn,t是从S到t的一条数字和最大的路径,从源点S开始,设从S到下一段的顶点S1已经求出,如此问题转化为求从S1到t的数字和最大的路径,显然S1,S2,...Sn,t一定构成一条从S1到t的数字和最大值的路径,如假如不然,设S1,r1,r2,....rq,t是一条数字和最大的路径,如此S,S1,r1,r2,....rq,t的路径经过数字和的最大值比S,S1,S2,...Sn,t的路径数字和更大,从而导致矛盾,所以数字三角形问题满足最优性原理。
课号:____CK5J08A ___ 课名:_____算法设计与分析______教师: ________________期末大作业要求:在以下几种方式中任选一种一.算法实际应用题任务要求:1.完成一个有一定实用性的程序,其中包含稍复杂的算法模块,算法输入和输出必须显示在图形界面上,最好能把算法运行过程展现在图形界面上。
2.撰写算法设计报告,描述算法设计流程,分析算法效率。
3.进行答辩。
评分标准:1.图形界面的操作方便性与对算法的展现程度(30分)2.算法的复杂程度和算法效率和实用性(30分)3.算法设计流程的解释的清晰度和算法效率分析的准确度(30分)4.答辩10分,采用教师提问学生回答和解释的形式,学生若不能自圆其说、对自己设计的算法流程也讲不清楚,则判定为抄袭,整个大作业为0分。
参考题目:1.算242.倒油3.趣味算式4.马步问题5.单源最短路径6.最小生成树7.工作分配8.2*2*2魔方9.长江游艇10.推箱子11.华容道12.文件搜索13.………..二.ACM算法设计题任务要求:1.完成2道及2道以上ACM算法设计题,题目由教师给定并公布在OJ系统中,学生限定时间内(2个小时),在其中选做2题以上,正确性也由OJ系统判定,并参照OJ系统的标准,形成排名。
完成数量不到2题的,不管排名如何,整个大作业都判定为不及格。
2.为所完成的每道题目撰写解题报告,描述设计思路与流程,分析课号:____CK5J08A ___ 课名:_____算法设计与分析______教师: ________________程序的时空效率。
评分标准:1.算法设计能力(60分),主要根据OJ系统中的排名来评定,部分提交的题目有抄袭嫌疑的学生,教师对其进行质询答辩,采用问答形式,学生若对其提交正确的任何题目,无法通过质询答辩,则判定为抄袭,整个大作业为0分。
2.算法表述与分析能力(40分),根据提交的解题报告中,对算法流程的描述的清晰程度,对算法时空效率的分析的准确程度,进行评定。
《算法分析与设计》作业( 一)本课程作业由两部分组成。
第一部分为”客观题部分”, 由15个选择题组成, 每题1分, 共15分。
第二部分为”主观题部分”,由简答题和论述题组成, 共15分。
作业总分30分, 将作为平时成绩记入课程总成绩。
客观题部分:一、选择题( 每题1分, 共15题)1、递归算法: ( C )A、直接调用自身B、间接调用自身C、直接或间接调用自身 D、不调用自身2、分治法的基本思想是将一个规模为n的问题分解为k个规模较小的字问题, 这些子问题: ( D )A、相互独立B、与原问题相同C、相互依赖D、相互独立且与原问题相同3、备忘录方法的递归方式是:( C )A、自顶向下B、自底向上C、和动态规划算法相同D、非递归的4、回溯法的求解目标是找出解空间中满足约束条件的:( A )A、所有解B、一些解C、极大解D、极小解5、贪心算法和动态规划算法共有特点是: ( A )A、最优子结构B、重叠子问题C、贪心选择D、形函数6、哈夫曼编码是: ( B)A、定长编码B、变长编码C、随机编码D、定长或变长编码7、多机调度的贪心策略是: ( A)A、最长处理时间作业优先B、最短处理时间作业优先C、随机调度D、最优调度8、程序能够不满足如下性质: ( D )A、零个或多个外部输入B、至少一个输出C、指令的确定性D、指令的有限性9、用分治法设计出的程序一般是: ( A )A、递归算法B、动态规划算法C、贪心算法D、回溯法10、采用动态规划算法分解得到的子问题:( C )A、相互独立B、与原问题相同C、相互依赖D、相互独立且与原问题相同11、回溯法搜索解空间的方法是: ( A )A、深度优先B、广度优先C、最小耗费优先D、随机搜索12、拉斯维加斯算法的一个显著特征是它所做的随机选性决策有可能导致算法: ( C )A、所需时间变化B、一定找到解C、找不到所需的解D、性能变差13、贪心算法能得到: ( C )A、全局最优解B、 0-1背包问题的解C、背包问题的解 D、无解14、能求解单源最短路径问题的算法是: ( A )A、分支限界法B、动态规划C、线形规划D、蒙特卡罗算法15、快速排序算法和线性时间选择算法的随机化版本是:( A )A、舍伍德算法B、蒙特卡罗算法C、拉斯维加斯算法D、数值随机化算法主观题部分:二、写出下列程序的答案( 每题2.5分, 共2题)1、请写出批处理作业调度的回溯算法。
《算法分析与设计》各章课后作业第一章 课后作业1. 设某算法在输入规模为n 时的计算时间为T(n)=10*2n。
若在甲台计算机上实现并完成该算法的时间为t 秒,现有一台运行速度是甲的64倍的另一台计算机乙,问在乙计算机上用同一算法在t 秒内能解决的问题的规模是多大?2.按照渐近阶从低到高的顺序排列以下表达式:4n 2,logn ,3n,20n ,2,n 2/3。
又n!应该排在哪一位?第二章 课后作业1. 用展开法求解下列递推关系:T(n)=⎩⎨⎧>+=1n )()2/(20n )1(n O n T O,写出T(n)的大O 记号表示。
2. 下面是实现在a[0]<=a[1]<=…<=a[n-1]中搜索x 的二分搜索算法,请根据二分 搜索技术在下划线处填充语句。
算法描述如下: template<class Type>public static int BinarySearch(int []a, int x, int n) { //在a[0]<=a[1]<=…<=a[n-1]中搜索 x // 找到x 时返回其在数组中的位置,否则返回-1 int left = 0; int right = n - 1; while ( ) {int middle = ;if(x == a[middle]) return ; if(x > a[middle]) left = middle + 1; else right= ; }return -1; // 未找到x}第三章课后作业1、选择题。
(1)下列算法中通常以自底向上的方式求解最优解的是()。
A、备忘录法B、动态规划法C、贪心法D、回溯法(2)备忘录方法是那种算法的变形。
()A、分治法B、动态规划法C、贪心法D、回溯法(3)矩阵连乘问题的算法可由()设计实现。
A、分支界限算法B、动态规划算法C、贪心算法D、回溯算法2.计算题。
算法设计与分析作业姓名:学号:专业:习题一1-1函数的渐进表达式3n2+10n=O(n2);n2/10+2n=O(2n);21+1/n=O(1);logn3=O(logn);10log3n=O(n)1-2O(1)和O(2)的区别分析与解答:根据符号O的定义可知O(1)=O(2).用O(1)和O(2)表示同一个函数时,差别仅在于其中的常数因子。
1-3按渐进阶排列表达式分析与解答:按渐进阶从低到高,函数排列顺序如下:O(2)<O(logn)<O(n2/3)<O(20n)<O(4n2)<O(3n)<O(n!)习题二算法分析题2-2 7个二分搜索算法分析与解答:(1)与主教材中的算法BinarySearch相比,数组段左、右游标left和right的调整不正确,导致陷入死循环。
(2)数组段左、右游标left和right的调整不正确,导致当x=a[n-1]时返回错误。
(3)数组段左、右游标left和right的调整不正确,导致当x=a[n-1]时返回错误。
(4)数组段左、右游标left和right的调整不正确,导致陷入死循环。
(5)算法正确,且当数组中有重复元素时,返回满足条件的最右元素。
(6)数组段左、右游标left和right的调整不正确,导致当x=a[n-1]时返回错误。
(7)数组段左、右游标left和right的调整不正确,导致当x=a[0]时陷入死循环。
2-26修改快速排序算法,使它在最坏情况下的计算时间为O(nlogn).分析与解答:从一个无序的序列中随机取出一个值q做为支点,然后把大于q的放到一边,小于q的放到q的另一边,然后再以q为分界点,分别对q的两边进行排序(快排时直接再对q两边重新取支点,整理,再取支点,...直到支点两旁都有序。
也就是支点两旁只有一个数时)#include <stdio.h>#include <stdlib.h>int Qsort(int p[],int beg,int end){if(beg+1>=end)return 0;//退出递归int low,hight,q;low=beg;hight=end;q=p[low];//q为支点,其实q可以为随机数。
算法理论、教改类题目学习大量相关算法(程序),总结出对应方法的一些特点,将其写成论文形式,并以足够的例子作为佐证。
24.论分治法、动态规划、贪心法的区别 25.论递归程序向非递归程序的转换 26.论应用型本科院校算法课程的教学目标和教学方法 27.论二叉树在计算机科学与技术中的应用 28.数据库索引的算法解释 29.论贪心法的适用范围 30.解空间搜索方法的选择依据 31.分治法算法分析综述
算法应用、算法研究类题目查阅大量相关资料,对相关内容给出初步的结果。
31.基于UCCI的中国象棋对弈引擎开发技术研究 32.五子棋对弈关键技术研究33.黑白棋对弈关键技术研究 34.数独初始局面生成算法研究 35.支持按文件名搜索的索引构造技术研究 36.通用回溯算法演示系统设计 37.通用分支限界算法演示系统设计 38.通用排序算法演示系统设计 39.通用动态规划算法演示系统设计
40.论文阅读和翻译类题目• 给出一个英文文献,用准确的语言将其翻译为中文,不需要逐字逐句翻译,但主要观点、算法思想和算法过程表述清楚、准确、充分。
格式要求• 论文正文中不得出现大段代码(超过10行)• 标题样式需规范• 参考文献不低于10篇,参考文献格式和标注位置须规范。
最接近点对问题问题此问题分为一维,二维,三维的情况1. 一维: 给定直线上n 个点,找其中一对点,使得在n 个点组成的所有点对中,该点对间的距离最小,这个问题比较简单,是引出二维解法的一个引子,因为一维的直线上的点,相邻点的距离肯定小于相隔的点的距离,只需要考虑相邻点即可。
2. 二维:给定平面上n 个点,找其中一对点,使得在n 个点组成的所有点对中,该点对间的距离最小,这是我们这一问题的重点3. 三维:给定空间上n 个点,找其中一对点,使得在n 个点组成的所有点对中,该点对间的距离最小,此问题是二维的解法的复杂化,具体可以在飞机航线等问题上运用,但在此不多做介绍。
基本思想由于该问题的基本解法是去考察每个点和其他所有点的距离。
因此它的时间复杂度是2()O n ,这样做的效率太低,我们就要去寻找一个更高效的办法:分治法。
1. 因二维的情况太过复杂,先考虑一维的情况中,可以用分治法对其进行分部计算: 把直线分成两部分, 1s 2s ,分别求出其最接近点的距离1d 2d 。
但分割开的地方的两点距离可能小于这两个值,这三个值进行比较之后,得到最后结果。
2. 鉴于此,二维的也可以用此方法进行计算:把待计算的点s 分成两部分1s 2s ,分别求出其最接近点的距离1d 2d 。
但1d 2d 最小的未必是s 中的最小距离d ,它有可能是1s 中的一个点和2s 中的一个点组成的最接近点对。
所以还要考虑1s 中的所有点到2s 中的每一个点的距离,一一比较之后得出一个最小值,再和1d 2d 比较,这就得出了最后结果。
3. 接下来是具体算法实现的步骤:1. 把待计算的点s 分成两部分1s 2s :重要的如何去划分,这里采用在二维平面上的中线(用横坐标的最小值加上最大值的平均数)来划分。
2. 分别求出其最接近点的距离1d 2d :这可以用一个递归来完成。
3. 计算1s 中的所有点到2s 中的每一个点的距离:这个问题是此问题的关键。
2010/2011第二学期计算机科学与技术专业2009级《算法分析与设计》课程大型作业班级:3110902学号:2009214390姓名:王真旎遗传算法一、算法背景遗传算法是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。
其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。
遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。
它是现代有关智能计算中的关键技术。
进入90年代,遗传算法迎来了兴盛发展时期,无论是理论研究还是应用研究都成了十分热门的课题。
尤其是遗传算法的应用研究显得格外活跃,不但它的应用领域扩大,而且利用遗传算法进行优化和规则学习的能力也显著提高,同时产业应用方面的研究也在摸索之中。
此外一些新的理论和方法在应用研究中亦得到了迅速的发展,这些无疑均给遗传算法增添了新的活力。
遗传算法的应用研究已从初期的组合优化求解扩展到了许多更新、更工程化的应用方面。
二、算法内容1.算法的简单描述遗传操作是模拟生物基因遗传的做法。
在遗传算法中,通过编码组成初始群体后,遗传操作的任务就是对群体的个体按照它们对环境适应度(适应度评估)施加一定的操作,从而实现优胜劣汰的进化过程。
从优化搜索的角度而言,遗传操作可使问题的解,一代又一代地优化,并逼近最优解。
1.1创建一个随机的初始状态初始种群是从解中随机选择出来的,将这些解比喻为染色体或基因,该种群被称为第一代,这和符号人工智能系统的情况不一样,在那里问题的初始状态已经给定了。
1.2.评估适应度对每一个解(染色体)指定一个适应度的值,根据问题求解的实际接近程度来指定(以便逼近求解问题的答案)。
不要把这些“解”与问题的“答案”混为一谈,可以把它理解成为要得到答案,系统可能需要利用的那些特性。
算法设计与分析大作业目录《算法设计与分析》课程大作业.............................................. 错误!未定义书签。
一.动态规划算法解决流水作业调度 (2)1、问题描述 (2)2、算法分析 (2)3. 算法的描述 (2)4、部分算法实现 (3)5. 运行结果 (4)6、时空效率分析 (4)二.贪心算法解多机调度问题 (4)1、问题描述 (4)2、算法分析 (4)3.部分算法实现 (5)4.计算复杂性分析 (6)5. 运行结果 (6)三.回溯法解决批作业调度问题 (6)1.问题描述 (6)2.算法思想 (6)3. 部分算法实现 (7)4.运行结果 (8)5.时间复杂性分析 (8)四.作业调度算法比较 (8)五.课程学习总结 (9)摘要:在现代企业中,作业调度已成为提高资源利用率、从而提高企业运行效益的关键环节之一。
把各个作业分配到车间现有的设备上,并确定它们的先后次序,这是一项复杂的工作本文就作业调度排序问题进行了研究,通过对几个经典作业调度算法的分析讨论,总结了各个算法对作业调度的求解过程,并给出了每个算法的复杂度及性能分析。
关键词:作业调度;动态规划;贪心算法;回溯法;一.动态规划算法解决流水作业调度1、问题描述给定n 个作业,每个作业有两道工序,分别在两台机器上处理。
一台机器一次只能处理一道工序,并且一道工序一旦开始就必须进行下去直到完成。
一个作业只有在机器1上的处理完成以后才能由机器2处理。
假设已知作业i 在机器j 上需要的处理时间为t[i,j]。
流水作业调度问题就是要求确定一个作业的处理顺序使得尽快完成这n 个作业。
2、算法分析直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。
在一般情况下,机器M2上会有机器空闲和作业积压2种情况。
在一般情况下,机器M1开始加工S 中作业时,机器M2还在加工其他作业,要等时间t 后才可利用。
算法设计与分析作业作业一:给一个数组,用冒泡排序、选择排序、合并排序与快速排序四种方法实现过程且比较,并把排序时间显示出来。
冒泡排序:原理:将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。
在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。
所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。
如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。
代码:package maopao;public class maopao{public void paixu(){int array[] = {1,3,-2,0,8,7,-1,13,63,-20,120};long start = System.nanoTime();//开始时间for(int i = 0;i<array.length;i++){for(int j = i+1;j<array.length;j++){if(array[i] < array[j]){int tempt = array[i];array[i] = array[j];array[j] = tempt;}}}for(int i = 0 ; i< array.length; i++){System.out.println(" "+array[i]+" ");}long end = System.nanoTime();//结束时间System.out.println("所花费的时间为: "+(end-start)+"纳秒" );//运行时间}public static void main(String[] args){maopao m = new maopao();m.paixu();}}运行结果:选择排序:原理:对待排序的记录序列进行n-1遍的处理,第i遍处理是将L[i..n]中最小者与L[i]交换位置。
算法设计与分析期末成绩考核标准要求:算法设计与分析考试方式为小论文形式。
下面给出了小论文的参考模型和参考题目,供大家选择。
1.小作业题目(仅供参考)(题目的难易:●简单10道题★中等11道题▲复杂10道题)●最佳浏览路线问题问题描述:某旅游区的街道呈网格状,其中东西向的街道都是旅游街,南向的街道都是林荫道。
由于游客众多,旅游街被规定为单行道。
游客在旅游街上只能从西向东走,在林荫道上既可以由南向北走,也可以从北向南走。
阿隆想到这个旅游区游玩,他的好友阿福给了他一些建议,用分值表示所有旅游街相邻两个路口之间的道路浏览的必要程度,分值从-100到100的整数,所有林荫道不打分,所有分值不可能全是负值。
阿隆可以从任一路口开始浏览,在任一路口结束浏览,请写出一个算法,帮助阿隆寻找一条最佳的浏览路线,使得这条路线的所有分值总和最大。
(算法设计与分析第二版P190—11题)●问题描述:某工业生产部门根据国家计划的安排,拟将某种高效率的5台机器,分配给所属的,A,B,C个工厂,各工厂在获得这种机器后,可以为国家盈利如图表所示,问:这5台机器如何分配给各工厂,才能使得国家盈利最大?(P190-14题)●问题描述:编写算法对输入的一个整数,判断他能否被4,7,9整除,并输出一下信息之一,能同时被4,7,9整除;能被其中两个数(要指出那两个)整除能被其中一个数(要指出哪一个)整除不能被4,7,9任一个整除。
(P118-16)●问题描述:某一印刷厂有6项加工任务,对印刷车间和装订车间所需的时间表如下图:完成每项任务都要先去印刷车间印刷,再到装订车间装订。
问咋样安排这6项加工任务的加工工序,使得加工工时最少?(P191-17)●问题描述:编写用动态规划法求组合数mC的算法(P191-19).n●问题描述:仿照分治算法中两个大数相乘的算法策略,完成求解两个n*n阶矩阵A和矩阵B的乘积的算法。
假设n=2k,要求算法的复杂性要小于O(n3).(P190-12)●问题描述:在一个n*m的方格中,m为奇数,放置有n*m个数,方格中间的下方有一人,此人可按照5个方向前进但不能跃出方格,如图所示,人每走过一个方格必须取此方格中的数。
算法设计与分析期末成绩考核标准要求:算法设计与分析考试方式为小论文形式。
下面给出了小论文的参考模型和参考题目,供大家选择。
1.小作业题目(仅供参考)(题目的难易:●简单10道题★中等11道题▲复杂10道题)●最佳浏览路线问题问题描述:某旅游区的街道呈网格状,其中东西向的街道都是旅游街,南向的街道都是林荫道。
由于游客众多,旅游街被规定为单行道。
游客在旅游街上只能从西向东走,在林荫道上既可以由南向北走,也可以从北向南走。
阿隆想到这个旅游区游玩,他的好友阿福给了他一些建议,用分值表示所有旅游街相邻两个路口之间的道路浏览的必要程度,分值从-100到100的整数,所有林荫道不打分,所有分值不可能全是负值。
阿隆可以从任一路口开始浏览,在任一路口结束浏览,请写出一个算法,帮助阿隆寻找一条最佳的浏览路线,使得这条路线的所有分值总和最大。
(算法设计与分析第二版P190—11题)●问题描述:某工业生产部门根据国家计划的安排,拟将某种高效率的5台机器,分配给所属的,A,B,C个工厂,各工厂在获得这种机器后,可以为国家盈利如图表所示,问:这5台机器如何分配给各工厂,才能使得国家盈利最大?(P190-14题)●问题描述:编写算法对输入的一个整数,判断他能否被4,7,9整除,并输出一下信息之一,能同时被4,7,9整除;能被其中两个数(要指出那两个)整除能被其中一个数(要指出哪一个)整除不能被4,7,9任一个整除。
(P118-16)●问题描述:某一印刷厂有6项加工任务,对印刷车间和装订车间所需的时间表如下图:完成每项任务都要先去印刷车间印刷,再到装订车间装订。
问咋样安排这6项加工任务的加工工序,使得加工工时最少?(P191-17)●问题描述:编写用动态规划法求组合数mC的算法(P191-19).n●问题描述:仿照分治算法中两个大数相乘的算法策略,完成求解两个n*n阶矩阵A和矩阵B的乘积的算法。
假设n=2k,要求算法的复杂性要小于O(n3).(P190-12)●问题描述:在一个n*m的方格中,m为奇数,放置有n*m个数,方格中间的下方有一人,此人可按照5个方向前进但不能跃出方格,如图所示,人每走过一个方格必须取此方格中的数。
算法分析与设计作业及参考答案作业题目1、请分析冒泡排序算法的时间复杂度和空间复杂度,并举例说明其在实际中的应用场景。
2、设计一个算法,用于在一个未排序的整数数组中找到第二大的元素,并分析其时间复杂度。
3、比较贪心算法和动态规划算法的异同,并分别举例说明它们在解决问题中的应用。
参考答案1、冒泡排序算法时间复杂度:冒泡排序的基本思想是通过相邻元素的比较和交换,将最大的元素逐步“浮”到数组的末尾。
在最坏情况下,数组完全逆序,需要进行 n 1 轮比较和交换,每一轮比较 n i 次(i 表示当前轮数),所以总的比较次数为 n(n 1) / 2,时间复杂度为 O(n^2)。
在最好情况下,数组已经有序,只需要进行一轮比较,时间复杂度为 O(n)。
平均情况下,时间复杂度也为 O(n^2)。
空间复杂度:冒泡排序只在原数组上进行操作,不需要额外的存储空间,空间复杂度为 O(1)。
应用场景:冒泡排序算法简单易懂,对于规模较小的数组,或者对算法的简单性要求较高而对性能要求不是特别苛刻的场景,如对少量数据进行简单排序时,可以使用冒泡排序。
例如,在一个小型的学生成绩管理系统中,需要对一个班级的少量学生成绩进行排序展示,冒泡排序就可以满足需求。
2、找到第二大元素的算法以下是一种使用遍历的方法来找到未排序整数数组中第二大元素的算法:```pythondef find_second_largest(arr):largest = arr0second_largest = float('inf')for num in arr:if num > largest:second_largest = largestlargest = numelif num > second_largest and num!= largest:second_largest = numreturn second_largest```时间复杂度分析:这个算法需要遍历数组一次,所以时间复杂度为O(n)。
算法分析与设计程序操作实现 2大作业实现操作者:08网本分组:6组每组1道大作业。
所占分值:30分(百分制)实现内容:1 循环赛日程表问题描述:设有n=2k个运动员要进行网球循环赛。
现要设计一个满足以下要求的比赛日程表:①每个选手必须与其他n-1个选手各赛一次。
②每个选手一天只能参赛一次。
③循环赛在n-1天内结束。
请按此要求将比赛日程表设计成有n行和n-1列的一个表。
在表中的第i行、第j列处填入第i个选手在第j天所遇到的选手。
其中1≤i≤n,1≤j≤n一1。
3-4个算法解决以上问题。
2 求3个数的最小公倍数问题描述:对任给的3个正整数,求它们的最小公倍数。
看完题目,读者一定会回忆起:最小公倍数的定义以及用短除法求这3个数的最小公倍数,甚至想到了最大公约数与最小公倍数的换算公式……。
其实,与问题相关的每一个经验和思路,都可能是解决这个问题的一种方法,下面就给出用这3种思路进行算法设计的过程。
3个算法解决以上问题。
3 猴子选大王问题描述:不同于自然界猴子选大王的方式,这里的猴子是这样选举它们的大王的:17只猴子围成一圈,从某只开始报数1—2—3—1—2—3—…,报“3”的猴子就被淘汰,游戏一直进行到圈内只剩一只猴子,它就是猴大王了。
通过解决这个问题将使我们进一步认识算法与数据结构的紧密关系。
3-4个算法解决以上问题。
4 最大子段和问题问题描述:给定n个整数(可能为负整数)a1,a2,a3,a4,a5,求形如:A i,a i+1,……,a j, i、j=1,…,n, i<=j的子段和的最大值。
当所有整数均为负整数时定义其最大子段和为0。
例如,当(a1,a2,a3,a4,a5 ,a6)=(-2,11,-4,13,-5,-2)时,最大子段和为:∑==ji kka20j=2,j=4(下标从1开始)3-4个算法解决以上问题。
5 与利润无关的背包问题1背包问题1:在9件物品中选出3件使其质量和与500克之差的绝对值最小。
算法分析与设计作业
一、冒泡排序
1.1冒泡排序算法
冒泡排序(Bubble Sort)也称为沉底排序,算法的特点是从数组头
部到尾部进行多次遍历,当遍历到一些数时,如果比它前面的数大就交换。
比较 n 个数大小,可以进行 n-1 次交换。
冒泡排序的时间复杂度为
O(n^2),空间复杂度为O(1)。
算法步骤如下:
(1)比较相邻的元素,如果第一个比第二个大,就交换他们两个的
位置;
(2)对每一对相邻元素作同样的工作,从开始第一对到结尾的最后
一对,这样在最后循环结束时,最大的数会移动到最后;
(3)重复第一步,直到所有元素排序完成。
1.2冒泡排序算法的优化
冒泡排序的时间复杂度为O(n^2),为提高算法的速度,可以对冒泡
排序算法进行优化。
算法在每一轮排序后会判断是否有可以交换的数据,如果没有就表明
已经全部排序完成,此时可以终止排序。
相比传统的算法,优化后的算法可以大大减少不必要的循环,提高排
序的速度。
二、快速排序
2.1快速排序算法
快速排序(Quick Sort)是一种分治策略,将大问题分解为小问题,同时在排序过程中不断的拆分问题,最终完成排序。
快速排序的时间复杂度为O(nlogn),空间复杂度为O(nlogn)。
算法步骤如下:。
算法设计技术与方法大作业学院________________专业______________姓名__________________________学号_______________________任课老师多项式求值的四种方法1.问题背景分别实现多项式求值的四种运算,若针对不同规模的输入值a,各算法的运行时间,问题规模n 分别取10, 50, 100, 150, 200, 300, 400, 500, 10000, 20000, 50000, 100000 时绘制四种算法运行时间的比较图。
2.程序设计分析题意可知,该题要用四种方法实现对多项式的求值计算,每种方法取从10-100000 不同的规模。
本文采用直接代入法和递归法。
而其中递归法分三类不同思路进行递归:①只3)=只-13) +时";。
, Q = 1, Q = Qx, P = P + a t Q;②P = a③3'3)=《3)工+。
"—,。
3.程序清单具体编程如下:clc;close all;clear all;n=[10 50 100 150 200 300 400 500 10000 20000 50000 100000];x=5;for i=l:12a=rand(l,(n(i)+l));%产生多项式,最高次幕为n(i)tic;forj=l:n(i); %直接代入法s(j)=a(j)*x A(j);endpl(i)=a(n(i)+l);for j=l:n(i);pl(i)=s ①+pl ⑴;endtl(i)=toc;tic;p2(i)=0;for j=l:(n(i)+l)p2(i)=p2⑴+a(j)*xWl); % 递归法1endt2(i)=toc;tic;p3(;i)=0;q=l;for j=2:(n (i)+l)q=q*x;p3(i)=p3(i)+a(j)*q; % 递归法2endt3(i)=toc;tic;p4 ①=0;for j=l:n(i);p4(i)=x*p4(i)+a(n⑴+l-j); % 递归法3endt4(i)=toc;endfigure(l);subplot(2,2,l);h=semilogx(n,t 1);set(h,'linestyle','-'「linewidth'』,'marker','s','color','g','markersize',6); xlabel(问题规模(n ));ylabel(运行时间(s),);title(方法一);grid on;subplot(2,2,2);h=semilogx(n,t2);set(h,'linestyle','-'「linewidth'』,'marker','s','color','b','markersize',6); xlabelC问题规模(n ),);ylabel(运行时间(s),);title(方法二);grid on;subplot(2,2,3);h=semilogx(n,t2);set(h,'linestyle','-'「linewidth'』,'marker','s','color',k,'markersize',6); xlabel(,问题规模(n ),);ylabel(运行时间(s),);title(方法三);grid on;subplot(2,2,4);h=semilogx(n,t2);set(h,'linestyle','-',Tinewidth', 1,'marker','s','color',、','markersize',6); xlabelC问题规模(n ),);ylabel(运行时间(s),);title(方法四);grid on;figure(2);g=semilogx(n,tl,'g+',n,t2,'bx',n,t3,'k*',n,t4,To‘);legend(方法一7方法二7方法三,,方法四);set(g,'linestyleV-','linewidth', 1,'markersize',8);xlabel('n=10, 50, 100, 150, 200, 300, 400, 500, 10000, 20000, 50000, 100000'); ylabel。
一、请安排投资计划,使总的利润最大。
写出你所设的状态变量、决策变量、状态转移方程与递推关系式,和手工求解的详细步 骤及结果。
解:设k 表示前k 个项目;状态变量为k x ,表示能投资到前k 个项目中的金额为k x ;决策变量为}0|{ , k k k k k k x u u D D u ≤≤=∈,表示将k u 的金额投入到第k 个项目中;状态转移方程为k k k u x x +=+1,表示能投资到前k+1个项目的金额等于能投资到前k 个项目的金额,加上投资到第k+1个项目的金额;指标函数为)(P k k x ,表示将k x 投入到前k 个项目中所能获得的最大利润;设)(A k k x 为向第k 个项目投资k x 金额所能获得的利润。
则递推关系式为:⎪⎩⎪⎨⎧+-====-∈)}(A )({P max )(P 00 , 0)(P 1k k k k k D u kk k k k u u x x x k x k k 或① 当k=0或0=k x 时,总利润一定为0③ 当k=2时,8万元只投资第一、第二个项目,有若将0万投资第一个项目,8万投资第二个项目,利润为0+75=75若将1万投资第一个项目,7万投资第二个项目,利润为5+74=79 若将2万投资第一个项目,6万投资第二个项目,利润为15+73=88 若将3万投资第一个项目,5万投资第二个项目,利润为40+70=110 若将4万投资第一个项目,4万投资第二个项目,利润为80+60=140 若将5万投资第一个项目,3万投资第二个项目,利润为90+40=130 若将6万投资第一个项目,2万投资第二个项目,利润为95+15=110 若将7万投资第一个项目,1万投资第二个项目,利润为98+5=103 若将8万投资第一个项目,0万投资第二个项目,利润为100+0=100此时将4万元投资第一个项目,将剩余4万元投资第二个项目可获得最大利润140万元 同时计算出将2x 万元投资到前两个项目的获利情况如下表:④ 当k=3时,8万元同时投资第一、第二、第三个项目,有 若将0万投资前两个项目,8万投资第三个项目,利润为0+53=53若将1万投资前两个项目,7万投资第三个项目,利润为5+52=57若将2万投资前两个项目,6万投资第三个项目,利润为15+51=66若将3万投资前两个项目,5万投资第三个项目,利润为40+50=90若将4万投资前两个项目,4万投资第三个项目,利润为80+45=125若将5万投资前两个项目,3万投资第三个项目,利润为90+40=130若将6万投资前两个项目,2万投资第三个项目,利润为95+26=121若将7万投资前两个项目,1万投资第三个项目,利润为120+4=124若将8万投资前两个项目,0万投资第三个项目,利润为140+0=140此时将4万元投资第一个项目,将剩余4万元投资第二个项目,第三个项目投资0元,可获得最大利润140万元。
《算法设计与分析大作业报告》班级:学号:姓名:分治法大作业报告问题陈述:编程实现归并排序算法和快速排序算法,输出排序结果。
输入10组相同的数据,验证排序结果和完成排序的比较次数。
分治法基本思想:分治法的基本思想是将问题分解成若干个子问题,然后求解子问题。
子问题较原问题要容易些,先得出子问题的解,由此得出原问题的解,这就是所谓“分而治之”的思想。
算法描述:当要求解一个输入规模为n,且n的取值相当大的问题时,如果问题可以分成k个不同子集合,得到k个不同的可独立求解的子问题,其中1<k≤n,而且子问题与原问题性质相同,原问题的解可由这些子问题的解合并得出。
那末,对于这类问题分治法是十分有效的。
本实验就是通过归并排序和快速排序来体现分治的思想。
1.归并排序的思想:将A(1),……,A(N)分成两个集合,对每个集合单独分类,然后将已分类的两个序列归并成一个含N个元素分好类的元素2.快速排序的思想:选取A的某个元素做为划分元素,然后将其他元素重新排列,使在划分元素以前出现的元素都小于或等于它,在划分元素之后出现的划分元素都大于等于它。
程序代码:#include <stdio.h>#include <time.h>#include <stdlib.h>void MergeSort(int *data,int x,int y,int *temp){ int p,q,m,i=x;if (y-x>1){m = x+(y-x)/2;p = x;q = m;MergeSort(data,x,m,temp);MergeSort(data,m,y,temp);while(p<m||q<y){if (q>=y||(p<m&&data[p]<data[q])){temp[i++] = data[p++];}else{temp[i++] = data[q++];}}for(i=x;i<y;i++)data[i] = temp[i]; }}void HoareSort(int *data,int x,int y){int p=x,q=y-1,temp;while(p<q) {while (q>p&&data[q]>=data[p])q--;if (q>p){temp = data[p],data[p] = data[q],data[q] =temp;p++;}while(q>p&&data[p]<=data[q])p++;if (p<q){temp = data[p],data[p] = data[q],data[q] =temp;q--;}if (p==q) {HoareSort(data,x,p);HoareSort(data,p+1,y);}}}int main(){int data[10],i;int temp[10];srand(time(NULL));for (i=0;i<10;i++){ data[i] = rand()%100; }printf("未排序排序的数据为:\n");for (i=0;i<10;i++){printf("%d ",data[i]);}printf("\n");printf("归并排序的顺序为: \n");MergeSort(data,0,10,temp);for (i=0;i<10;i++){printf("%d ",data[i]); }printf("\n");printf("快速排序的顺序为: \n");HoareSort(data,0,10);for (i=0;i<10;i++){printf("%d ",data[i]);}printf("\n");return 0;}运行结果:结论分析:归并排序和快速排序都是递归排序,但是归并排序是稳定的排序方法,快速排序是不稳定的排序方法。
大作业报告
课程名称:算法设计与分析班级:15计科辅修大作业成绩:
大作业名称:分治策略学号:1442264245 批阅教师签字:
大作业编号:大作业一姓名:杨亮大作业日期:年月日
指导教师:陈平组号:大作业时间:时分-时分
一、大作业目的
减治法是将员问题中的问题分解成若干个子问题,并将原问题的解与子问题
的解之间存在着某种确定的关系,如果原问题的规模为n,则子问题的规模通常
是n/2或n-1;能够很大程度上简化计算机查找的时间与检查运算的内容而在折半查找中利用了记录有叙序列的特点,其查找过程是:取得序列中的
中间记录作为比较对象,若给定值与中间记录相等,则查找成功;若给定值小于
中间记录,则在中间记录的左边继续查找;若给定值大于中间记录,则在给定区
间的右边继续查找。
不断重复上述过程,直到查找成功;在若干区域中没有记录
的,查找则是查找失败。
二、大作业内容
输入一个有序排列的空间为N的序列,查找在这个序列中某一个字符所在序
列中的位置,并输出这个数在序列中的位置
三、大作业环境
操作系统:windows7
调试软件名称:Microsoft Visual C++ 6.0
版本号:2008
上级地点:安徽新华学院信息与工程学院教室601
机器台号:student
四、问题分析
(1):解决问题的思路【1】
1.先定区间:如数组a[N],则区间为0—N-1
2.确定区间是否是有序排列的
3.选取区间的中点数“M”与所要选的数“X”进行大小比较
4.如果中点数“M”<选取的数“X”,则选取右区间:即右区间的范围是
“M+1—N-1”
5.如果中点数“M”>选取的数“X”,则选取左区间:即左区间的范围是:
“0—M-1”
6.依次用剩下的区间进行比较,直到最后找到我们所选取的数,找到这个
数载数组中的位置,并输出它的位置
(2):用序列的中间值与选定值比较:
1.若M=X则直接运行结束。
2.若M<X或者M>X,则运行查找的空间直接减半依次运行能空间复杂度极
大的缩短了。
3.若没有查找到记录结果,则输出没有结果。
综上“减治法-折半查找”的所有可能出现的情况看,“减治法-折半查找”
能很大程度上的减少运行的时空复杂度。
(3):其他:
1.在减治法-折半查找法中的序列要是有序序列
2.序列N的区间是从“0—N-1”
3.a如果中点数“M”<选取的数“X”,则选取右区间:即右区间的范围
是:“M+1—N-1”
b如果中点数“M”>选取的数“X”,则选取左区间:即左区间的范围是:“0—M-1”
五、问题解决
(1)问题:输入一个有序排列的空间为11的数组,查找在这个数组中某一个字符所在数组中的位置,并输出这个数在数组中的位置。
解决思路:
1.先定区间:序列a[11],则区间为0—10;
2.确定区间是否是有序排列的;
3.选取区间的中点数“M=(0+10)/2”与所要选的数“X”进
行大小比较
4.如果中点数“M=(0+10)/2”<选取的数“X”,则选取右区
间:即右区间的范围是:“6—10”
5.如果中点数“M=(0+10)/2”>选取的数“X”,则选取左区
间:即左区间的范围是:“0—4”
6.依次用剩下的区间进行比较,直到最后找到我们所选取的
数,找到这个数载数组中的位置,并输出它的位置
(2)运行编写的程序:
#include<stdio.h>
void main()
{
int a[10];
int i,x,l,h,m;
l=0;h=10;
printf("请输入从小到大的11个数:\n");//输入有11个数的序列
for(i=0;i<11;i++)
scanf("%d",&a[i]);
printf("请输入要查找的数:\n");
scanf("%d",&x);
loop:
if(l>h)
{
printf("查无此数\n");//若在序列中没有查找到这个记录则输出“查无次数”
}
else
{
m=(l+h)/2;//确定序列中间值M
if(a[m]>x)//中间值M大于查询值X
{
h=m-1; //则选择序列左区间“0—M-1”
goto loop;
}
else if(a[m]<x)//中间值M小于查询值X
{
l=m+1;//则选择序列右区间“M+1—N-1”
goto loop;
}
else if(a[m]==x)//若中间值M=查询值X
{
printf("这个数是第%d\n",m);
}
else
{
l=m+1;
goto loop;
}
}
}
(3)
1.特别注意
a.在减治法-折半查找法中的序列要是有序序列
b.序列N的区间是从“0—N-1”
c.①如果中点数“M”<选取的数“X”,则选取右区间:即右区间的范围是:
“M+1—N-1”
②如果中点数“M”>选取的数“X”,则选取左区间:即左区间的范围是:
“0—M-1”
2.程序循环什么时候结束
a.如果中点数“M”<选取的数“X”,则选取右区间依次比较右区间的中间值
与选取的值“X”直到找出“X”输出它在序列中的位置
b.如果中点数“M”>选取的数“X”,则选取左区间依次比较左区间的中间值
与选取的值“X”直到找出“X”输出它在序列中的位置
c.如果中点数“M”=选取的数“X”则直接找到该数,输出它在序列中的位置(4)
1.调试过程中出现的问题
a.出现查找到的数在序列中中的位置与实际输入在的序列中的位置不一致。
b.左右区间划分时划分不出来。
2.又做了怎样的改进
a.在数列中的数的位置与他的表达方式差“1”
则编写程序时:①有N个数的数组它的区间为0—N-1
②中间值比较的时候写成 a[m]>x或a[m]<x
则输出选择的数“X”的位置与它在数列中的位置一致
b. 对于划分左右区间依据中间值M划分
①如果中点数“M”<选取的数“X”,则选取右区间:即右区间的范围
是:“M+1—N-1”程序代码为“L=M+1”
②如果中点数“M”>选取的数“X”,则选取左区间:即左区间的范
围是:“0—M-1”程序代码为“H= M -1”
(5)需要在此说明的:
①.在减治法-折半查找法中的序列要是有序序列
②. 若没有查找到记录结果,则输出没有结果,不代表查询出错。
六、大作业结果总结
(1)A对不同的输入,该算法都存在可能出现以下几种情况
①如果中点数“M”<选取的数“X”,则选取右区间:程序代码为
“L=M+1”
②如果中点数“M”>选取的数“X”,则选取左区间:程序代码为
“H= M -1”
③如果中点数=选取的数“X”,则直接找到该数,输出它在序列中
的位置
④若没有查找到记录结果,则输出没有结果
B你的测试数据完全覆盖了你所想到的这些情况,测试结果如何?
编写的包括了以上的所有情况,
如
①如果中点数“M”<选取的数“X”,
else if(a[m]<x)
{
l=m+1;goto loop;}
②如果中点数“M”>选取的数“X”,
if(a[m]>x)
h=m-1;;goto loop;
③如果中点数=选取的数“X”
else if(a[m]==x)
{
printf("这个数是第%d\n",m);
}
④若没有查找到记录结果,则输出没有结果
if(l>h)
{
printf("查无此数\n");}
测试结果
(2)算法实现的复杂度在问题规模很大时可以接受吗?
减质法—折半查找法是利用区间的中间值进行比较和划分,及时问题
规模很大但是在几次比较划分之后也会变得很小,完全可以接受。
(3)如果不用分治方法还能想到其他的解决方式吗?和分治相比会有更好的效率吗?
答:①可以用减治法—折半查找法
②a.分治法:是把问题变成一些小问题,解决了小问题,也就能解决
大问题
b.减治法是每一步都能缩小一半最后变成1个最小的小问题。
所以在问题范围较小时两者相差不多,但是在问题范围较大的时
候减治法比分治法有很好的效果。
(4)所选用的数据结构合适吗?
答:合适,从数据结果来看分治法具有很好的减少空间混乱度。
(5)叙述通过大作业你对分治方法的理解及你认为的分治法的优缺点【2】。
答:分治法可以通俗的解释为:把一片领土分解,分解为若干块小部分,然后一块块地占领征服,被分解的可以是不同的政治派别或是其他什
么,然后让他们彼此异化。
分治法的优点:
a分--将问题分解为规模更小的子问题;
b治--将这些规模更小的子问题逐个击破;
c合--将已解决的子问题合并,最终得出“母”问题的解;
七、附录
(1)大作业参考的资料和网址
【1】王红梅,胡明算法设计与分析(第二版)【M】北京:清华大学出版社,2013.
【2】王晓东.算法设计与分析(第二版).【M】北京:清华大学出版社,2011.。