算法分析与设计:作业
- 格式:ppt
- 大小:448.00 KB
- 文档页数:15
算法分析与设计(线下作业⼆)《算法分析与设计》学习中⼼:专业:学号:姓名:作业练习⼆⼀、名词解释1、MST性质2、⼦问题的重叠性质递归算法求解问题时,每次产⽣的⼦问题并不总是新问题,有些⼦问题被反复计算多次,这种性质称为⼦问题的重叠性质。
⼆、简答题1、简述动态规划算法求解的基本要素。
答:动态规划算法求解的基本要素包括:1)最优⼦结构是问题能⽤动态规划算法求解的前提;2)动态规划算法,对每⼀个⼦问题只解⼀次,⽽后将其解保存在⼀个表格中,当再次需要解此⼦问题时,只是简单地⽤常数时间查看⼀下结果,即重叠⼦问题。
2、备忘录⽅法和动态规划算法相⽐有何异同简述之。
答:备忘录⽅法是动态规划算法的变形。
与动态规划算法⼀样,备忘录⽅法⽤表格保存已解决的⼦问题的答案,在下次需要解此问题时,只要简单地查看该⼦问题的解答,⽽不必重新计算。
备忘录⽅法与动态规划算法不同的是,备忘录⽅法的递归⽅式是⾃顶向下的,⽽动态规划算法则是⾃底向上递归的。
因此,备忘录⽅法的控制结构与直接递归⽅法的控制结构相同,区别在于备忘录⽅法为每个解过的⼦问题建⽴了备忘录以备需要时查看,避免了相同的⼦问题的重复求解,⽽直接递归⽅法没有此功能。
3、贪⼼算法求解的问题主要具有哪些性质简述之。
答:贪⼼算法求解的问题⼀般具有⼆个重要的性质:⼀是贪⼼选择性质,这是贪⼼算法可⾏的第⼀个基本要素;另⼀个是最优⼦结构性质,问题的最优⼦结构性质是该问题可⽤贪⼼算法求解的关键特征。
三、算法编写及算法应⽤分析题1、设计求解如下最⼤⼦段和问题的动态规划算法。
只需给出其递推计算公式即可。
最⼤⼦段和问题:给定由n 个整数(可能为负整数)组成的序列a1a2 … an,求该序列形如Σi≤k≤j ak的⼦段和的最⼤值。
当所有整数均为负整数时定义其最⼤⼦段和为0。
依次定义,所求的最优值为max{0, max1≤i≤j≤n Σi≤k≤j ak }。
2、关于多段图问题。
设G =(V ,E)是⼀个赋权有向图,其顶点集V 被划分成k>2个不相交的⼦集V i :1i k ≤≤,其中,V 1和V k 分别只有⼀个顶点s (称为源)和⼀个顶点t (称为汇),图中所有的边(u,v ),i u V ∈,1i v V +∈。
算法分析与设计作业参考答案《算法分析与设计》作业参考答案作业⼀⼀、名词解释: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.设计⼀个分治算法计算⼀棵⼆叉树的⾼度。
《算法分析与设计》作业参考答案作业一一、名词解释:1.递归算法:直接或间接地调用自身的算法称为递归算法。
2.程序:程序是算法用某种程序设计语言的具体实现。
二、简答题:1.算法需要满足哪些性质?简述之。
答:算法是若干指令的有穷序列,满足性质:(1)输入:有零个或多个外部量作为算法的输入。
(2)输出:算法产生至少一个量作为输出。
(3)确定性:组成算法的每条指令清晰、无歧义。
(4)有限性:算法中每条指令的执行次数有限,执行每条指令的时间也有限。
2.简要分析分治法能解决的问题具有的特征。
答:分析分治法能解决的问题主要具有如下特征:(1)该问题的规模缩小到一定的程度就可以容易地解决;(2)该问题可以分解为若干个规模较小的相同问题,即该问题具有最优子结构性质; (3)利用该问题分解出的子问题的解可以合并为该问题的解;(4)该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题。
3.简要分析在递归算法中消除递归调用,将递归算法转化为非递归算法的方法。
答:将递归算法转化为非递归算法的方法主要有:(1)采用一个用户定义的栈来模拟系统的递归调用工作栈。
该方法通用性强,但本质上还是递归,只不过人工做了本来由编译器做的事情,优化效果不明显。
(2)用递推来实现递归函数。
(3)通过Cooper 变换、反演变换能将一些递归转化为尾递归,从而迭代求出结果。
后两种方法在时空复杂度上均有较大改善,但其适用范围有限。
三、算法编写及算法应用分析题: 1.冒泡排序算法的基本运算如下:for i ←1 to n-1 do for j ←1 to n-i do if a[j]<a[j+1] then 交换a[j]、a[j+1]; 分析该算法的时间复杂性。
答:排序算法的基本运算步为元素比较,冒泡排序算法的时间复杂性就是求比较次数与n 的关系。
(1)设比较一次花时间1;(2)内循环次数为:n-i 次,(i=1,…n ),花时间为:∑-=-=in j i n 1)(1(3)外循环次数为:n-1,花时间为:2.设计一个分治算法计算一棵二叉树的高度。
东师21秋学期《算法分析与设计》在线作业1(答案)一、单选题1. 字符串”China Beijing”的长度是()A.12B. 13C. 14D. 15正确答案. B2. 一棵二叉树中共有70个叶子结点与80个度为1的结点,则该二叉树的总结点数为()。
A.219B. 221C. 229D. 231正确答案. A3. 栈和队列的共同点是()A.都是先进先出B. 都是先进后出C. 只允许在端点处插入和删除元素D. 没有共同点正确答案. C4. 使用简单选择排序法对n个数进行排序要进行()趟比较。
A. NB. n-1C. n+1D. 不一定正确答案. B5. 下面给出的四种排序方法中,排序过程中的比较次数与排序方法无关的是()。
A. 选择排序法B. 插入排序法C. 快速排序法D. 堆积排序法正确答案. A6. 图中有关路径的定义是()。
A. 由顶点和相邻顶点序偶构成的边所形成的序列B. 由不同顶点所形成的序列C. 由不同边所形成的序列D. 上述定义都不是正确答案. A7. 执行memset(s,'a',4)后,s的值为()。
A. "aaaa"B. "a4"C. "4a"D. "eeee"正确答案. A8. 一个算法的评价主要从空间复杂度和()来考虑。
A. 时间复杂度B. 算法有效性C. 算法有穷性D. 算法可读性正确答案. A9. 下面的时间复杂度按数量级递增的顺序排列,正确的是注释从功能上可以分为()。
A. 平方阶O(n2),对数阶O(log2n),指数阶O(2n)B. 线性对数阶O(nlog2n),指数阶O(2n),立方阶O(n3)C. 常数阶O(1),线性阶O(n),指数阶O(2n)D. k次方阶O(nk),指数阶O(2n),对数阶O(log2n)正确答案. C10. ()嵌在源程序体中,用于描述其后的语句或程序段做什么工作,也就是解释下面要做什么,或是执行了下面的语句会怎么样。
《算法分析与设计》作业(三)本课程作业由两部分组成。
第一部分为“客观题部分”,由15个选择题组成,每题1分,共15分。
第二部分为“主观题部分”,由简答题和论述题组成,共15分。
作业总分30分,将作为平时成绩记入课程总成绩。
客观题部分:一、选择题(每题1分,共15题)1、贪心算法解各个子问题的方法是:( B )A、自底向上B、自顶向下C、随机选择D、自底向上或自顶向下2、用回溯法解旅行售货员问题时生成的树是:( B )A、子集树B、排列树C、二叉树D、多叉树3、在n后问题中任意两个皇后能放在:( D )A、同一行B、同一列C、同一斜线D、以上都不行4、用回溯法解0-1背包问题时生成的解空间树是:( A )A、子集树B、排列树C、二叉树D、多叉树5、用贪心算法解单源最短路径问题时采用的算法是:( A )A、Dijkstra算法B、Prime算法C、Kruskal算法D、蒙特卡罗算法6、在用动态规划解流水作业调度时的最优调度法则是:( C )A、最优子结构B、重叠子问题C、Johnson法则D、最长处理时间作业优先7、算法与程序的区别在于:( C )A、输入B、输出C、指令的确定性D、指令的有限性8、从分治法的一般设计模式可以看出,用它设计的程序一般是:( D )A、顺序B、选择C、循环D、递归9、回溯法的解空间是在搜索过程中:( A )A、动态产生B、静态产生C、无解空间D、动态或者静态产生10、在用贪心法解多机调度时的贪心选择策略是:( D )A、最优子结构B、重叠子问题C、Johnson法则D、最长处理时间作业优先11、合并排序和快速排序采用的共同策略是:( A )A、分治法B、蒙特卡罗法C、拉斯维加斯法D、单纯形法12、用回溯法解最大团问题时生成的解空间树是:( D )A、子集树B、排列树C、二叉树D、多叉树13、用分支限界法解装载问题的解空间是:( B )A、子集树B、排列树C、单向链表D、多向链表14、计算定积分的算法:( A )A、随机投点法B、舍伍德法C、分治法D、回溯法15、用随机化算法解同一实例两次得到:( C )A、结果和时间都相同B、结果相同时间不相同C、结果和时间都不相同D、以上都不对主观题部分:二、改错题(每题2.5分,共2题)下面有两个二分搜索算法,请判断它们的正确性。
《算法分析与设计》作业( 一)本课程作业由两部分组成。
第一部分为”客观题部分”, 由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.计算题。
算法理论、教改类题目学习大量相关算法(程序),总结出对应方法的一些特点,将其写成论文形式,并以足够的例子作为佐证。
24.论分治法、动态规划、贪心法的区别 25.论递归程序向非递归程序的转换 26.论应用型本科院校算法课程的教学目标和教学方法 27.论二叉树在计算机科学与技术中的应用 28.数据库索引的算法解释 29.论贪心法的适用范围 30.解空间搜索方法的选择依据 31.分治法算法分析综述
算法应用、算法研究类题目查阅大量相关资料,对相关内容给出初步的结果。
31.基于UCCI的中国象棋对弈引擎开发技术研究 32.五子棋对弈关键技术研究33.黑白棋对弈关键技术研究 34.数独初始局面生成算法研究 35.支持按文件名搜索的索引构造技术研究 36.通用回溯算法演示系统设计 37.通用分支限界算法演示系统设计 38.通用排序算法演示系统设计 39.通用动态规划算法演示系统设计
40.论文阅读和翻译类题目• 给出一个英文文献,用准确的语言将其翻译为中文,不需要逐字逐句翻译,但主要观点、算法思想和算法过程表述清楚、准确、充分。
格式要求• 论文正文中不得出现大段代码(超过10行)• 标题样式需规范• 参考文献不低于10篇,参考文献格式和标注位置须规范。
算法设计与分析作业作业一:给一个数组,用冒泡排序、选择排序、合并排序与快速排序四种方法实现过程且比较,并把排序时间显示出来。
冒泡排序:原理:将待排序的元素看作是竖着排列的“气泡”,较小的元素比较轻,从而要往上浮。
在冒泡排序算法中我们要对这个“气泡”序列处理若干遍。
所谓一遍处理,就是自底向上检查一遍这个序列,并时刻注意两个相邻的元素的顺序是否正确。
如果发现两个相邻元素的顺序不对,即“轻”的元素在下面,就交换它们的位置。
代码: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]交换位置。
算法设计与分析课程大作业-CAL-FENGHAI-(2020YEAR-YICAI)_JINGBIAN题目作业调度问题及算法分析学院名称:计算机与信息工程学院专业名称:计算机科学与技术目录《算法设计与分析》课程大作业.................................................................... 错误!未定义书签。
一.动态规划算法解决流水作业调度. (4)1、问题描述 (4)2、算法分析 (4)3. 算法的描述 (5)4、部分算法实现 (6)5. 运行结果 (7)6、时空效率分析 (7)二.贪心算法解多机调度问题 (7)1、问题描述 (7)2、算法分析 (7)3.部分算法实现 (7)4.计算复杂性分析 (8)5. 运行结果 (8)三.回溯法解决批作业调度问题 (8)1.问题描述 (8)2.算法思想 (9)3. 部分算法实现 (10)4.运行结果 (10)5.时间复杂性分析 (11)四.作业调度算法比较 (11)五.课程学习总结 (12)摘要:在现代企业中,作业调度已成为提高资源利用率、从而提高企业运行效益的关键环节之一。
把各个作业分配到车间现有的设备上,并确定它们的先后次序,这是一项复杂的工作本文就作业调度排序问题进行了研究,通过对几个经典作业调度算法的分析讨论,总结了各个算法对作业调度的求解过程,并给出了每个算法的复杂度及性能分析。
关键词:作业调度;动态规划;贪心算法;回溯法;一.动态规划算法解决流水作业调度1、问题描述给定n 个作业,每个作业有两道工序,分别在两台机器上处理。
一台机器一次只能处理一道工序,并且一道工序一旦开始就必须进行下去直到完成。
一个作业只有在机器1上的处理完成以后才能由机器2处理。
假设已知作业i 在机器j 上需要的处理时间为t[i,j]。
流水作业调度问题就是要求确定一个作业的处理顺序使得尽快完成这n 个作业。
2、算法分析直观上,一个最优调度应使机器M1没有空闲时间,且机器M2的空闲时间最少。
第二章递归习题导论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)。
算法分析与设计教程习题解答第1章 算法引论1. 解:算法是一组有穷的规则,它规定了解决某一特定类型问题的一系列计算方法。
频率计数是指计算机执行程序中的某一条语句的执行次数。
多项式时间算法是指可用多项式函数对某算法进行计算时间限界的算法。
指数时间算法是指某算法的计算时间只能使用指数函数限界的算法。
2. 解:算法分析的目的是使算法设计者知道为完成一项任务所设计的算法的优劣,进而促使人们想方设法地设计出一些效率更高效的算法,以便达到少花钱、多办事、办好事的经济效果。
3. 解:事前分析是指求出某个算法的一个时间限界函数(它是一些有关参数的函数);事后测试指收集计算机对于某个算法的执行时间和占用空间的统计资料。
4. 解:评价一个算法应从事前分析和事后测试这两个阶段进行,事前分析主要应从时间复杂度和空间复杂度这两个维度进行分析;事后测试主要应对所评价的算法作时空性能分布图。
5. 解:①n=11; ②n=12; ③n=982; ④n=39。
第2章 递归算法与分治算法1. 解:递归算法是将归纳法的思想应用于算法设计之中,递归算法充分地利用了计算机系统内部机能,自动实现调用过程中对于相关且必要的信息的保存与恢复;分治算法是把一个问题划分为一个或多个子问题,每个子问题与原问题具有完全相同的解决思路,进而可以按照递归的思路进行求解。
2. 解:通过分治算法的一般设计步骤进行说明。
3. 解:int fibonacci(int n) {if(n<=1) return 1;return fibonacci(n-1)+fibonacci(n-2); }4. 解:void hanoi(int n,int a,int b,int c) {if(n>0) {hanoi(n-1,a,c,b); move(a,b);hanoi(n-1,c,b,a); } } 5. 解:①22*2)(−−=n n f n② )log *()(n n n f O =6. 解:算法略。
《算法分析与设计》作业1、考虑,10≤≤i x 而不是x i ∈{0,1}的连续背包问题。
一种可行的贪婪策略是:按价值密度非递减的顺序检查物品,若剩余容量能容下正在考察的物品,将其装入;否则,往背包内装如此物品的一部分。
(a) 对于n=3,w=[100,10,10],p=[20,15,15],以及c=105,上述装入法获得结果是什么?(b)证明这种贪婪算法总能获得最优解。
(c) 用伪代码描述此算法。
答:(a )利用贪婪算法,按价值密度考察的背包为w2,w3,w1;背包w2和w3重20,还可以容纳85,由于10≤≤i x ,背包w1还可以装入x1=0.85,则背包内物品总价值为15+15+20*0.85=47.(b )假设已按价值密度排好序,考察w1,w2,……,wi ,……,对应的价值为p1,p2,……,pi,……如果装到pi-1再装pi 时,恰好要取xi 个wi 。
(,10≤≤i x ) 因为比它价值密度大的都已装载完,所以此时获得的为最优解。
(c )算法描述如下: template <class T>int ContainerLoading( int x[], T w[], T c, int n ) {int *t = new int[n+1]; IndirectSort(w, t, n); for( int i=1; i<=n; i++) x[i] = 0;for(i=1; i<=n && w[t[i]]<=c; i++){ x[t[i]] = 1; c += w[t[i]]; } delete []t; }2、证明当且仅当二分图没有覆盖时,下述算法找不到覆盖。
m=0; //当前覆盖的大小对于A中的所有i,New[i]=Degree[i]对于B中的所有i,Cov[i]=falsewhile(对于A中的某些i,New[i]>0) {设v是具有最大的New[i]的顶点;C[m++]=v;for(所有邻接于v的顶点j) {If(!Cov[j]) {Cov[j] = true;对于所有邻接于j的顶点,使其New[k]减1}}}if (有些顶点未被覆盖) 失败else 找到一个覆盖2)给出一个具有覆盖的二分图,使得上述算法找不到最小覆盖。
十六皇后问题【问题描述】八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。
该问题是国际西洋棋棋手马克斯·贝瑟尔于1848年提出:在8X8格的国际象棋上摆放八个皇后,使其不能互相攻击,即任意两个皇后都不能处于同一行、同一列或同一斜线上,问有多少种摆法。
高斯认为有76种方案。
1854年在柏林的象棋杂志上不同的作者发表了40种不同的解,后来有人用图论的方法解出92种结果。
计算机发明后,有多种计算机语言可以解决此问题。
十六皇后是对八皇后的一个延伸,只不过是皇后的数目增多。
【基本要求】设计16皇后的程序,要求如下:⏹输出其中的一个解⏹输出其总共有多少个解⏹要有计时器,计算并显示运行时间。
【问题求解】1 需求规格说明要求根据已学的回溯算法,在原有8皇后的回溯算法基础上加以改进,从而提高效率,降低时间复杂度或是空间复杂度。
2 总体分析与设计2.1 设计思想:皇后问题是回溯算法的典型应用,我们试探性的在每一行放置一个皇后,皇后位置要求与其他皇后在不同一列和正负45°对角线上,如果某一行没有合适的位置,那么需要回溯到上一行,上一行重新选择一个合法的位置,当所有的行都正确放置了皇后,那么这便是一个合法解。
算法1:利用一个二维数组保存整个棋盘,元素可以放置皇后置为1,不能放置皇后置为0。
判断某一位置能否放置皇后需要进行如下判断(1)一列上只能有一个皇后;(2)135°斜对角线上只能有一个皇后;(3)45°对角线上只能有一个皇后。
算法2:算法1可以找到正确解,但是发现大可不必利用二维数组保存皇后位置,可以改进为用一维数组来存储结果,数组下标代表行,数组中值代表当前行的皇后位置,便可节省大量空间。
判断某一位置能否放置皇后只需要一遍循环。
改进算法:当计算出一个解之后,便可根据矩阵列对称性找到另一个解,那么时间和空间会节省一半。
2.2 算法流程:图 1. 算法流程3 算法实现3.1 类图设计:图 2. 类图⏹NQueenTestMain:测试类,控制台界面,提供用户选择算法,输入皇后数目,是否打印结果,以及运行时间显示。
算法分析与设计作业
一、冒泡排序
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)。
算法步骤如下:。