算法设计与分析课程大作业
算法设计与分析习题答案
算法设计与分析习题答案算法设计与分析是计算机科学中一个重要的领域,它涉及到算法的创建、优化以及评估。
以下是一些典型的算法设计与分析习题及其答案。
习题1:二分查找算法问题描述:给定一个已排序的整数数组,编写一个函数来查找一个目标值是否存在于数组中。
答案:二分查找算法的基本思想是将数组分成两半,比较中间元素与目标值的大小,如果目标值等于中间元素,则查找成功;如果目标值小于中间元素,则在左半部分继续查找;如果目标值大于中间元素,则在右半部分继续查找。
这个过程会不断重复,直到找到目标值或搜索范围为空。
```pythondef binary_search(arr, target):low, high = 0, len(arr) - 1while low <= high:mid = (low + high) // 2if arr[mid] == target:return Trueelif arr[mid] < target:low = mid + 1else:high = mid - 1return False```习题2:归并排序算法问题描述:给定一个无序数组,使用归并排序算法对其进行排序。
答案:归并排序是一种分治算法,它将数组分成两半,分别对这两半进行排序,然后将排序好的两半合并成一个有序数组。
```pythondef merge_sort(arr):if len(arr) > 1:mid = len(arr) // 2left_half = arr[:mid]right_half = arr[mid:]merge_sort(left_half)merge_sort(right_half)i = j = k = 0while i < len(left_half) and j < len(right_half): if left_half[i] < right_half[j]:arr[k] = left_half[i]i += 1else:arr[k] = right_half[j]j += 1k += 1while i < len(left_half):arr[k] = left_half[i]i += 1k += 1while j < len(right_half):arr[k] = right_half[j]j += 1k += 1arr = [38, 27, 43, 3, 9, 82, 10]merge_sort(arr)print("Sorted array is:", arr)```习题3:动态规划求解最长公共子序列问题问题描述:给定两个序列,找到它们的最长公共子序列。
算法分析与设计作业参考答案
算法分析与设计作业参考答案《算法分析与设计》作业参考答案作业⼀⼀、名词解释: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的路径数字和更大,从而导致矛盾,所以数字三角形问题满足最优性原理。
算法分析与设计作业及参考答案样本
《算法分析与设计》作业( 一)本课程作业由两部分组成。
第一部分为”客观题部分”, 由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、请写出批处理作业调度的回溯算法。
《算法设计与分析》第一次作业_题目要求与模板
学号 09710118《算法设计与分析》第一次作业学生姓名范振山专业、班级09计算机一班指导教师唐国峰成绩计算机与信息工程学院软件工程系2012 年 3 月 20 日第一次作业:动态规划算法的运用1、作业题目1.给出基于动态规划算法的最长公共子序列问题的求解过程。
2.给出基于动态规划算法的最大字段和问题的求解过程。
关于本次作业的要求:本次作业为随堂课后作业,要求学生在规定时间内独立完成该作业,并且提交电子版成果物及打印版成果物。
具体说明如下所示:1.完成作业前复习课程所学知识以及阅读和理解指定的课外阅读材料;2.学生独自完成作业指定内容;3.完成作业后,用统一的作业模板编写本次作业。
4.提交说明:(1)电子版提交说明:a 需要提交Winrar压缩包,文件名为“《算法设计与分析》第一次作业_学号_姓名”,如“《算法设计与分析》第一次作业_09290101_张三”。
压缩包内为一个“《算法设计与分析》第一次作业_学号_姓名”命名的顶层文件夹,其下为两个文件夹,一个文件夹命名为“源程序”,另一个文件夹命名为“作业电子版”。
其下分别放置对应个人成果物。
(2)打印版提交说明:a 不可随意更改模板样式。
b 字体:中文为宋体,大小为10号字,英文为Time New Roman,大小为10号字。
c 行间距:单倍行距。
(3)提交截止时间:2012年3月30日16:00。
二、学生完成部分(一)题目一:1. 题目分析2. 算法构造在此论证算法设计中的一些必要的设计依据。
3. 算法实现程序源代码(请写入必要的注释)。
4. 运行结果5. 经验归纳请仿照此步骤完成作业内容。
三、作业完成过程的心得体会。
算法设计与分析作业
算法设计与分析作业姓名:学号:专业:习题一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可以为随机数。
《算法分析与设计》大型作业
2010/2011第二学期计算机科学与技术专业2009级《算法分析与设计》课程大型作业班级:3110902学号:2009214390姓名:王真旎遗传算法一、算法背景遗传算法是一类借鉴生物界的进化规律(适者生存,优胜劣汰遗传机制)演化而来的随机化搜索方法。
其主要特点是直接对结构对象进行操作,不存在求导和函数连续性的限定;具有内在的隐并行性和更好的全局寻优能力;采用概率化的寻优方法,能自动获取和指导优化的搜索空间,自适应地调整搜索方向,不需要确定的规则。
遗传算法的这些性质,已被人们广泛地应用于组合优化、机器学习、信号处理、自适应控制和人工生命等领域。
它是现代有关智能计算中的关键技术。
进入90年代,遗传算法迎来了兴盛发展时期,无论是理论研究还是应用研究都成了十分热门的课题。
尤其是遗传算法的应用研究显得格外活跃,不但它的应用领域扩大,而且利用遗传算法进行优化和规则学习的能力也显著提高,同时产业应用方面的研究也在摸索之中。
此外一些新的理论和方法在应用研究中亦得到了迅速的发展,这些无疑均给遗传算法增添了新的活力。
遗传算法的应用研究已从初期的组合优化求解扩展到了许多更新、更工程化的应用方面。
二、算法内容1.算法的简单描述遗传操作是模拟生物基因遗传的做法。
在遗传算法中,通过编码组成初始群体后,遗传操作的任务就是对群体的个体按照它们对环境适应度(适应度评估)施加一定的操作,从而实现优胜劣汰的进化过程。
从优化搜索的角度而言,遗传操作可使问题的解,一代又一代地优化,并逼近最优解。
1.1创建一个随机的初始状态初始种群是从解中随机选择出来的,将这些解比喻为染色体或基因,该种群被称为第一代,这和符号人工智能系统的情况不一样,在那里问题的初始状态已经给定了。
1.2.评估适应度对每一个解(染色体)指定一个适应度的值,根据问题求解的实际接近程度来指定(以便逼近求解问题的答案)。
不要把这些“解”与问题的“答案”混为一谈,可以把它理解成为要得到答案,系统可能需要利用的那些特性。
算法设计与分析作业
算法设计与分析作业作业一:给一个数组,用冒泡排序、选择排序、合并排序与快速排序四种方法实现过程且比较,并把排序时间显示出来。
冒泡排序:原理:将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。
在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。
所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。
如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。
代码: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个方向前进但不能跃出方格,如图所示,人每走过一个方格必须取此方格中的数。
算法设计与分析(王多强)作业参考答案.docx
第二章递归习题导论4.1-17(/?) = 27(b / 2)+ 1=> M = 2T5 /2) + 1%)习题导论4.1-6Tin) = 2T(0) + 1做代换:m=log2n另 S(m)=T(2m )则有: S(/z?) = 2S(zz? / 2) + 1 化简有:S(m)=O(m) 所以 T(n)=O(logn)习题4.2-27(/7)= T(n / 3) + 7(2/7 / 3) + 劲 注意最长分支 2n/3-*(2n/3)2 -*(2n/3)3...-*(2n^)log3/2n 习题4.3-1a) T(n) = 4T(n/2) + nb) T(n) = 4T(n/2) + n 2c 取大于1/2小于1的数即可,如珈习题4.3-4f(n )/nlogba = n 2log n/n'°g"二 log nvn所以不满足规则3直接化简即可,T(n)=O(n 2log 2n)c) T(n) = 4T(n/2) + n 3情况 3, ◎ (r?). 验证 4f(n/2)=4(n/2)3=n 3/2^cn 3,这里7X2")27(2"/彳)+情况4 0(n 2)情况 2, © (n 2logn)第三章习题4.5注意三分Z—和三分Z二分割点的计算ml = (2low+high)^m2 = (low+2high)/3习题4.20主要是验证T(n/r) + T(0)>|« n/r+O的数量级是否小于n的1次方(线性) 利用关系式:\n / r」n (/7 - r - 1) / /进行化简r=3:\r / 2~|~|_/2 / /_] / 2~| > 2 z? / r / 2 = n / r」> (/? 一2) / 3则,刀一卜/2北刀 / 厂」/ 2] < /? - (/? - 2) / 3 = 2/7 / 3 + 2 / 3 则,n〃 +羊n +厉超线性了r=7:\r / 2]\n / r\/ 2〕>/ 7」/2 = 2山 / 7」> 2(刀一6) / 7则,n - \r / i\\n / /」/ 2〕v 刀一2(刀一6) / 7 = 5刀 / 7 + 12 / 7可证,当n>48的时候,上式小于3伙则,n/7+3nA = 25n/28 <n 成立r=9:\r / 2][n / 厂」/ 2〕> 5[刀 / 9」/ 2 = (5 / 2)^/9」> 5(刀-8)/18n一\r / 2\[n / /」/ 2〕< 13/?/18 + 40/18可证,当n>20的时候,上式小于7n/8 则,n/9+7n/8 = 71n/72 <n 成立r=ll习题4.25肓接带入验证即可棋盘覆盖问题角上用一个骨牌覆盖,认为构造有特殊方格的区域,然后在四个区域上递归求解即可第四章中位数中位数习题导论9-2A)比较明显。
算法分析与设计作业及参考答案
算法分析与设计作业及参考答案作业题目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大作业
算法分析与设计程序操作实现 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克之差的绝对值最小。
算法设计与分析大作业
算法Flowshop的主要计算时间花在对作业集的排序上。在这里,我们使用冒泡排
序法(BubbleSort),因此,在最坏情况下算法FlowJob所需要的计算时间为O(nlog n)。
所需要的空闲显然是O(n)。
.贪心算法解多机调度冋题
1、问题描述
多机调度问题要求给出一种作业调度方案, 使所给的n个作业在尽可能短的时间内由m台机 器加工处理完成。约定,每个作业均可在任何一台机器上加工处理, 但未完工前不允许中断处理。 作业不能拆分成更小的子作业。这个问题是NP完全问题,到目前为止还没有有效的解法。对于这 一类问题,用贪心选择策略有时可以设计出较好的近似算法。
{int i;
Jobtype *d = new Jobtype[ n];
for( i=0; i<n; i++)
{
d[i].key = a[i]>b[i]?b[i]:a[i];〃按Johnson法则分别取对应的b[i]或a[i]值作为关键字
d[i].job=a[i]v=b[i];〃给符合条件a[i]<b[i]的放入到N1子集标记为true
2、算法分析
贪心算法只需按顺序以数组方式提供ห้องสมุดไป่ตู้作业的加工时间和机器的台数;求出作业的个数,
若小于机器台数,就将作业逐个分配给就近的机器,所需要的加工时间,即为最长作业所需 时间。
若作业数大于机器台数,将作业按加工时间的多少降序排序,以机器数建立最小堆,先将 前m个作业分配给m个机器,最小堆顶是最小的元素(即m个作业中加工时间最少的作业), 将其移出并加上后续作业的加工时间,再插入堆,这时会改变原来的状态,升到堆顶的机器 力卩工总时间最少,它再移出加后续作业的加工时间,在插入堆,依此类推,直到全部作业结 束。堆中的最大值就是完成所有作业所需的最短时间。
算法分析与设计作业
算法分析与设计作业
一、冒泡排序
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)。
算法步骤如下:。
北航研究生 算法设计与分析大作业一
一、请安排投资计划,使总的利润最大。
写出你所设的状态变量、决策变量、状态转移方程与递推关系式,和手工求解的详细步 骤及结果。
解:设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;}运行结果:结论分析:归并排序和快速排序都是递归排序,但是归并排序是稳定的排序方法,快速排序是不稳定的排序方法。
算法设计与分析报告大作业问题详解
算法设计技术与方法大作业学院电子工程学院专业电路与系统姓名学号导师姓名作业 1.分别实现多项式求值的四种运算,若针对不同规模的输入值a ,各算法的运行时间,问题 规模n 分别取10,50,100,150,200,300,400,500,10000,20000,50000,100000时绘制四种算法运行时间的比较图。
2.分别实现矩阵相乘的3种算法,比较三种算法在矩阵大小分别为2222⨯,3322⨯,4422⨯,5522⨯,6622⨯,7722⨯,8822⨯,9922⨯,101022⨯,111122⨯,121222⨯时的运行时间与MATLAB 自带的矩阵相乘的运行时间,绘制时间对比图。
3.利用遗传算法求解下面的问题:)20sin()4sin(5.21),(m ax 221121x x x x x x f ππ⋅+⋅+=⎩⎨⎧≤≤≤≤-8.51.41.120.3..21x x t s1、分析题意可知,该题要用四种不同的方法实现对多项式的求值计算,每种方法取从10-100000不同的规模。
本文采用了以下方法进行求值:直接代入法和递归法。
而其中递归法分三类不同思路进行递归:① n n n n x a x P x P +=-)()(1;② 0a P =,1=Q ,Q a P P Qx Q i +==,;③ i n i i a x x P x P --+'=')()(1。
本文对上述四种方法进行了编程,具体代码如下: 程序1.1文件名poly.m% 主程序:实现不同规模下多项式求值的四种运算clc;close all ;clear all ;n=[10 50 100 150 200 300 400 500 10000 20000 50000 100000];x=2;for i=1:12a=rand(1,(n(i)+1)); % 产生多项式,最高次幂为n(i)+1tic;p1(i)=polyval(a,x); % 直接代入法t1(i)=toc;tic;p2(i)=0;for j=1:(n(i)+1)p2(i)=p2(i)+a(j)*x^(j-1); % 递归法1endt2(i)=toc;tic;p3(i)=0;q=1;for j=2:(n(i)+1)q=q*x;p3(i)=p3(i)+a(j)*q; % 递归法2endt3(i)=toc;tic;p4(i)=0;for j=1:n(i);p4(i)=x*p4(i)+a(n(i)+1-j); % 递归法3endt4(i)=toc;endfigure(1);subplot(2,2,1);h=semilogx(n,t1); % 这里不能用plot,横轴需要取对数,下同set(h,'linestyle','-','linewidth',1.8,'marker','*','color','g','markersize',6); xlabel('The scale of the problem:n');ylabel('time for first method(s)');title('the relationship between time and scale');grid on;subplot(2,2,2);h=semilogx(n,t2);set(h,'linestyle','-','linewidth',1.8,'marker','*','color','b','markersize',6); xlabel('The scale of the problem:n');ylabel('time for second method(s)');title('the relationship between time and scale');grid on;subplot(2,2,3);h=semilogx(n,t2);set(h,'linestyle','-','linewidth',1.8,'marker','*','color','k','markersize',6); xlabel('The scale of the problem:n');ylabel('time for third method(s)');title('the relationship between time and scale');grid on;subplot(2,2,4);h=semilogx(n,t2);set(h,'linestyle','-','linewidth',1.8,'marker','*','color','r','markersize',6); xlabel('The scale of the problem:n');ylabel('time for forth method(s)');title('the relationship between time and scale');grid on;figure(2);g=semilogx(n,t1,'g+',n,t2,'bx',n,t3,'k*',n,t4,'ro');legend('the first method','the second method','the third method','the forth method'); set(g,'linestyle','-','linewidth',2.0,'markersize',8);xlabel('n=10, 50, 100, 150, 200, 300, 400, 500, 10000, 20000, 50000, 100000'); ylabel('time');title('The comparison chart of four different methods for polyval');grid on;运行结果如下:图1.1 四种方法所用时间随规模不同而变化的结果图图 2.2 四种方法所用时间随规模不同而变化的对比图由理论分析可知,四种算法的时间复杂度分别为)(2n O 、)(2n O 、)(n O 、)(n O ,由图1.2分析可知,直接带入计算和递归法所用时间相差无几,这与理论分析一直。
算法设计大作业
纸牌游戏—小猫钓鱼规定:甲和乙手中的牌的牌面只有1~9。
分析:1.甲有两种操作,分别是出牌和赢牌。
——》出牌就是出队,赢牌就是入队。
2.乙有两种操作,分别是出牌和赢牌。
——》出牌就是出队,赢牌就是入队。
3.桌子可以看做是一个栈。
每打出一张牌放到桌上就相当于入栈。
当有人赢牌的时候,依次将牌从桌上拿走,这就相当于出栈。
1.首先创建结构体用来实现队列#include <stdio.h>#include<string.h>#include<stdlib.o>struct queue{int data[1000];int head;int tail;};说明:Head用来存储对头,tail用来存储队尾。
数组data用来存储队列中的元素,数组data 的大小预设为1000。
2.再创建一个结构体来实现栈struct stack{int data[10];int top;};说明:top用来存储栈顶,数组data用来存储栈中的元素,大小设置为10,因为只有9个不同的牌面。
3.定义两个队列变量q1,和q2。
q1用来模拟甲手中的牌,q2用来模拟乙手中的牌,定义一个栈变量s用来模拟桌上的牌。
structqueue q1,q1;struct stack s;4.初始化队列和栈//初始化队列q1和q2为空,此时两人手中还没有牌q1.head = 1;q1.tail = 1;q2.head = 1;q2.tail = 1;//初始化栈s为空,最开始的时候桌子上也没有牌5.分两次读入甲乙最初时手中的牌//先读入6张牌,放到甲手上for(int i=1;i<=6;i++){scanf(“%d”,&q1.data[q1.tail]);//读入一个数到队尾q1.tail ++;//队尾往后挪一位}//再读入6张牌,放到乙手中for(int i=1;i<=6;i++){scanf(“%d”,&q2.data[q2.tail]);//读入一个数到队尾q2.tail ++;//队尾往后挪一位}6.甲先出牌t = q1.data[q1.head];//甲先亮出一张牌7判断打出的牌和桌上的牌有没有相同flag = 0;for(int i=1;i<=top;i++){if(t==s[i]){flag = 1;break;}}8.如果flag的值为0,表示甲没能赢得桌上的牌,将打出的牌留在桌上if(flag == 0){//甲此轮没有赢牌q1.head++;//甲已经打出一张牌,所有要把打出的牌出队s.top++;s.data[s.top] = t;//再把打出的牌放到桌上,即入栈}9.如果flag的值为1就表明可以赢得桌上的牌,需要将赢得的牌依次放入甲的手中if(flag ==1){//甲此轮可以赢牌q1.head++;q1.data[q1.tail]=t;q1.tail++;while(s.data[s.top] !=t){q1.data[q1.tail] = s.data[s.top];q1.tail++;s.top--;}}10.甲乙流程一样,判断游戏结束while(q1.head < q1.tail && q2.head < q2.tail)11.输出最终谁赢得游戏if(q2.head == q2.tail){printf(“甲游戏获胜”);printf(“甲当前手中的牌是:”);for(inti= q1.head;i<=q1.tail;i++)printf(“%d”,q1.data[i]);if(s.top>0){printf(“\n桌上的牌是:”);for(inti=1;i<=s.top;i++)printf(“%d”,s.data[i]);}else{printf(“\n桌上已经没有牌了”);}}优化:定义一个大小为10的数组来记录当前桌上已经有哪些牌面就可以了int book[10];将数组book[1]~book[9]初始化为0,因此刚开始桌面上一张牌也没有for (int i=1;i<=9;i++)book[i] = 0;如果桌上增加了一张牌面为2的牌,那就需要将book[2]设置为1,表示牌面为2的牌桌面上已经有了,如果这张牌面为2的牌被拿走后,需要及时将book[2]重新设置问为0,表示桌上已经没有牌面为2的牌了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
题目作业调度问题及算法分析
学院名称:计算机与信息工程学院
专业名称:计算机科学与技术
目录
《算法设计与分析》课程大作业 (1)
一.动态规划算法解决流水作业调度 (3)
1、问题描述 (3)
2、算法分析 (3)
3. 算法的描述 (4)
4、部分算法实现 (5)
5. 运行结果 (6)
6、时空效率分析 (6)
二.贪心算法解多机调度问题 (6)
1、问题描述 (6)
2、算法分析 (7)
3.部分算法实现 (7)
4.计算复杂性分析 (8)
5. 运行结果 (9)
三.回溯法解决批作业调度问题 (9)
1.问题描述 (9)
2.算法思想 (10)
3. 部分算法实现 (11)
4.运行结果 (12)
5.时间复杂性分析 (12)
四.作业调度算法比较 (12)
五.课程学习总结 (13)
摘要:
在现代企业中,作业调度已成为提高资源利用率、从而提高企业运行效益的关键环节之一。
把各个作业分配到车间现有的设备上,并确定它们的先后次序,这是一项复杂的工作本文就作业调度排序问题进行了研究,通过对几个经典作业调度算法的分析讨论,总结了各个算法对作业调度的求解过程,并给出了每个算法的复杂度及性能分析。
关键词:作业调度;动态规划;贪心算法;回溯法;
一.动态规划算法解决流水作业调度
1、问题描述
给定n 个作业,每个作业有两道工序,分别在两台机器上处理。
一台机器一次只能处理一道工序,并且一道工序一旦开始就必须进行下去直到完成。
一个作业只有在机器1上的处理完成以后才能由机器2处理。
假设已知作业i 在机器j 上需要的处理时间为t[i,j]。
流水作业调度问题就是要求确定一个作业的处理顺序使得尽快完成这n 个作业。
2、算法分析
直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。
在一般情况下,机器M2上会有机器空闲和作业积压2种情况。
在一般情况下,机器M1开始加工S 中作业时,机器M2还在加工其他作业,要等时间t 后才可利用。
将这种情况下完成S 中作业所需的最短时间记为T(S,t)。
流水作业调度问题的最优值为T(N,0)。
由流水作业调度问题的最优子结构性质可知,
)}},{({min )0,(1i i n i b i N T a N T -+=≤≤(1)
})}0,max{},{({min ),(i i i S i a t b i S T a t S T -+-+=∈(2) 从公式(1)可以看出,该问题类似一个排列问题,求N 个作业的最优调度问题,利用其子结构性质,对集合中的每一个作业进行试调度,在所有的试调度中,取其中加工时间最短的作业做为选择方案。
将问题规模缩小。
公式(2)说明一般情况下,对作业集S 进行调度,在M2机器上的等待时间,除了需要等该部件在M1机器上完成时间,还要冲抵一部分原来的等待时间,如果冲抵已成负值,自然仍需等待M1将作业做完,所以公式取max{t-ai,0}。
3. 算法的描述
从分析可知,流水作业调度问题一定存在满足Johnson 法则的最优调度,且容易由下面的算法确定。
流水作业调度问题的Johnson 算法:
(1)令]}2,[]1,[|{]},2,[]1,[|{21i t i t i N i t i t i N ≥=<=;
(2)将中作业依的非减序排列;将中作业依的非增序排列;
作业接种作业构成满足Johnson 法则的最优调度。
4、部分算法实现
5. 运行结果
6、时空效率分析
算法Flowshop的主要计算时间花在对作业集的排序上。
在这里,我们使用冒泡排序法(BubbleSort),因此,在最坏情
况下算法FlowJob所需要的计算时间为)
n
O。
所需要的空
log
(n
闲显然是)
O。
(n
二.贪心算法解多机调度问题
1、问题描述
多机调度问题要求给出一种作业调度方案,使所给的n个作业在尽可能短的时间内由m台机器加工处理完成。
约定,每个作业均可在任何一台机器上加工处理,但未完工前不允许中断处理。
作业不能拆分成更小的子作业。
这个问题是NP完全问题,到目前为止还没有有效的解法。
对于这一类问题,用贪心选择策略有时可以设计出较好的近似算法。
2、算法分析
贪心算法只需按顺序以数组方式提供各作业的加工时间和机器的台数;求出作业的个数,若小于机器台数,就将作业逐个分配给就近的机器,所需要的加工时间,即为最长作业所需时间。
若作业数大于机器台数,将作业按加工时间的多少降序排序,以机器数建立最小堆,先将前m个作业分配给m个机器,最小堆顶是最小的元素(即m个作业中加工时间最少的作业),将其移出并加上后续作业的加工时间,再插入堆,这时会改变原来的状态,升到堆顶的机器加工总时间最少,它再移出加后续作业的加工时间,在插入堆,依此类推,直到全部作业结束。
堆中的最大值就是完成所有作业所需的最短时间。
3.部分算法实现
4.计算复杂性分析
当n≤m 时,所有作业可以一次安排给各机器,算法greedy需要o(1) 时间。
当n>m 时,排序耗时O(nlogn)。
初始化堆需要O(m) 时间。
关于堆的removeMin和put运算共耗时O(nlogm),因此算法greedy 所需的计算时间为O(nlogn+nlogm)=O(nlogn)。
5.运行结果
三.回溯法解决批作业调度问题
1.问题描述
输入:
1. 任务数N
2. 机器数M
3. 随机序列长度t[i],其中t[i]=x表示第i个任务完成需要时间单位x,
输出:
1. 开销时间besttime,表示最佳调度需要时间单位
2. 最佳调度序列bestx[],其中bestx[i]=x,表示将第i个任务分配给第x个机器执行。
2.算法思想
解空间的表示:
一个深度为N的M叉树。
t[i]:第i个任务的时间
x[i]=j:当前输出结果
Res[i]=j:表示第i个任务要运行在第j台机器上
time_machine[i]:第i个机器上的运行时间
基本思路:
1、搜索从开始结点(根结点)出发,以DFS搜索整个解空间。
2、每搜索完一条路径则记录下time_min和Res[i]序列,开始结点就成为一个活结点,
同时也成为当前的扩展结点。
在当前的扩展结点处向纵深方向移至一个新结点,
并成为一个新的活结点,也成为当前扩展结点。
3、如果在当前的扩展结点处不能再向纵深方向扩展,则当前扩展结点就成为死结点。
此时,应往回移动(回溯)至最近的一个活结点处,并使这个活结点成为当前的扩展
结点;直至找到一个解或全部解。
3.部分算法实现
else
{for(int i=1;i<=K;i++)
{x[k] = i;//将第k个任务放到第i个机器上面if( placetest(k) )
{
time_machine[i] += t[k];
Backtrack(k+1,t,x);
time_machine[i] -= t[k];
}
}
4.运行结果
5.时间复杂性分析
由于没有使用限界函数进行优化,算法时间和空间复杂度呈指数级增长。
所以该算法不适合较大规模的计算。
蓝线表示机器数一定M=3时,n增大时求解最佳调度对所消耗的时间,该趋势随着指数增加。
四.作业调度算法比较
在流水作业调度中,Johnson算法这是在只有两台设备情况下的最优排序算法,同时说明工件的第一道工序和最后一道工序的加工时间对排序的影响是主要的。
贪心算法只需按顺序以数组方式提供各作业的加工时间和机器的台数;求出作业的个数,若小于机器台数,就将作业逐个分配给就近的机器,所需要的加工时间,即为最长作业所需时间复
杂度为
O(nlogn)。
回溯算法解决批作业调度问题与前面两个问题不同,前两个是求所有作业在M2机器上加工完成的最后时间,而这里要求的是求所有作业在机器M2上完成处理时间的总和达到最小。
这种调度算法可用于计算加工费用。
批处理作业调度问题属于排列树的解空间问题,因此时间复杂度为Ω(n!)
五.课程学习总结
算法分析与设计是一门非常重要的课程,很多问题的解决,程序的编写都要依赖它,算法的学习对于培养一个人的逻辑思维能力是有极大帮助的,它可以培养我们养成思考分析问题,解决问题的能力。
但是算法的学习同时也需要较强的理解能力,有些算法程序不易读懂,这时需要在理解问题的本质上对算法程序进行解读。
在对一个问题进行算法设计时,要了解问题的特点,找到适合的方法才能得到理想的结果。
在本门课程过程中,我深刻体会到算法是建立在解法基础之上的,是在某个具体问题解法过程的分析之后,归纳出的解决一类相关问题的程序或步骤;如果一个具体问题具有代表性,其解法又具有程序性,那么这样的解法也能体现算法思想.在学习过程中老师起到了极大的引导及指导作用,也让我们明白了在算法学习中我们要多了解一些问题的最新解法及关注算法在实际问题中的应用。
在本次学习过
程中还发现了自己的很多不足,在以后的学习中更要弥补不足,要熟练掌握一些算法思想及其应用。
(注:文档可能无法思考全面,请浏览后下载,供参考。
可复制、编制,期待你的好评与关注)。