算法分析与设计作业

合集下载

算法分析与设计(线下作业二)

算法分析与设计(线下作业二)

算法分析与设计(线下作业⼆)《算法分析与设计》学习中⼼:专业:学号:姓名:作业练习⼆⼀、名词解释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.设计⼀个分治算法计算⼀棵⼆叉树的⾼度。

2014年12月中南大学网络教育课程考试:算法分析与设计作业参考答案

2014年12月中南大学网络教育课程考试:算法分析与设计作业参考答案

《算法分析与设计》作业参考答案作业一一、名词解释: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(答案)

东师21秋学期《算法分析与设计》在线作业1(答案)

东师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. ()嵌在源程序体中,用于描述其后的语句或程序段做什么工作,也就是解释下面要做什么,或是执行了下面的语句会怎么样。

北师大2018年春算法分析与设计作业(三)答案

北师大2018年春算法分析与设计作业(三)答案

《算法分析与设计》作业(三)本课程作业由两部分组成。

第一部分为“客观题部分”,由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篇,参考文献格式和标注位置须规范。

东师《算法分析与设计》20春在线作业2答案19

东师《算法分析与设计》20春在线作业2答案19

(单选题)1: 图中有关路径的定义是()。

A: 由顶点和相邻顶点序偶构成的边所形成的序列
B: 由不同顶点所形成的序列
C: 由不同边所形成的序列
D: 上述定义都不是
正确答案: A
(单选题)2: ()是一个基本完整的开发工具集,它包括了整个软件生命周期中所需要的大部分工具,如UML工具、代码管控工具、集成开发环境等等。

A: VS
B: VM
C: Dev-C++
D: IDE
正确答案: A
(单选题)3: 下列数据结构中,属于非线性结构的是()。

A: 循环队列
B: 带链队列
C: 二叉树
D: 带链栈
正确答案: C
(单选题)4: 下列叙述中正确的是()。

A: 顺序存储结构的存储一定是连续的,链式存储结构的存储空间不一定是连续的
B: 顺序存储结构只针对线性结构,链式存储结构只针对非线性结构
C: 顺序存储结构能存储有序表,链式存储结构不能存储有序表
D: 链式存储结构比顺序存储结构节省存储空间
正确答案: A
(单选题)5: 十六进制中最大的数码是()。

A: 16
B: 15
C: F
D: E
正确答案: C
(单选题)6: 二进制,就表示某一位置上的数运算时是逢()进一位。

A: 2
B: 8
C: 9
D: 10
正确答案: A
(单选题)7: 在程序代码编辑框外(一般都是程序代码的最左侧)双击,就成功设置了一个断。

中科院计算机算法设计与分析各章作业+历年习题

中科院计算机算法设计与分析各章作业+历年习题

5.下面那些规则是正确的?为什么? 1). f (n) O( F (n)), g (n) O(G(n)) f (n) / g (n) O( F (n) / G(n)) ;错 2). f (n) O( F (n)), g (n) O(G(n)) f (n) / g (n) ( F (n) / G(n)) ;错 3). f (n) O( F (n)), g (n) O(G(n)) f (n) / g (n) ( F (n) / G(n)) ;错 4). f (n) ( F (n)), g (n) (G(n)) f (n) / g (n) ( F (n) / G(n)) ;错 5). f (n) ( F (n)), g (n) (G(n)) f (n) / g (n) ( F (n) / G(n)) 。错 6).
7
对顶点个数进行归纳。 当顶点数|v(D)|=2 时,因为每个点的入度和出度相等,易得构成有向 Euler 环游。 假设顶点数|v(D)|=k 时结论成立,则 当顶点数|v(D)|=k + 1 时,任取 v∈v(D).设 S={以 v 为终点的边},K={以 v 为始点的边},因为 v 的入度和出度相等,故 S 和 K 中边数相等。记 G=D-v.对 G 做如下操作: 任取 S 和 K 中各一条边 e1、e2 ,设在 D 中 e1 v1v , e2 vv2 ,则对 G 和 S 做如下操作 G G v1v2 , S S {e2} ,重复此步骤直到 S 为空。这个过程最终 得到的 G 有 k 个顶点,且每个顶点的度与在 G 中完全一样。由归纳假设,G 中 存在有向 Euler 环游,设为 C。在 G 中从任一点出发沿 C 的对应边前行,每当遇 到上述添加边 v1v2 时, 都用对应的两条边 e1, e2 代替, 这样可以获得有向 Euler 环游。 3)G 是至少有三个顶点的无向图,则 G 包含 Euler 环游等价于 G 中无奇度顶 点。 (即任意顶点的度为偶数) 。 3. 设 G 是具有 n 个顶点和 m 条边的无向图, 如果 G 是连通的, 而且满足 m = n-1, 证明 G 是树。

算法分析与设计作业及参考答案

算法分析与设计作业及参考答案

算法分析与设计作业及参考答案作业题目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)给出一个具有覆盖的二分图,使得上述算法找不到最小覆盖。

算法分析与设计:作业

算法分析与设计:作业

2021/3/27
CHENLI
6
习题2.5—4,P64
• 4. 爬梯子. 假设每一步可以爬一格或者两格 梯子,爬一部n格梯子一共有几种爬法?
– 解:令C(n)表示总的爬法,则C(n-1)表示第一 步爬一格梯子的爬法,C(n-2)表示第一步爬二 格梯子的爬法,所以有 C(n) = C(n-1)+C(n-2), n>2 C(1) = 1, C(2) = 2 解之得 C(n) = F(n+1),这里F(n)表示Fibonacci数列
2021/3/27
CHENLI
3
习题1.2—5,P13
• 5. 写出十进制正整数转换为二进制整数的 算法
– 解:算法 Binary(n) //输入:十进制正整数n //输出:bkbk-1···b1b0 k←0
while n ≠ 0
bk ← n mod 2 n ← [n/2]
k ← k+1
2021/3/27
CHENLI
4
习题2.1—7,P39
• 7. Gaussian消去法用于求解n个n元线性方 程联立的方程组. 乘法是其基本操作,且大 约需要n3/3乘法运算. 问 a. 解一个1000个方程联立的方程组比解一 个500个方程联立的方程组要多运行多少时 间?
– 解:设cM是一次乘法运行的时间,则 T(n) ≈ cMn3/3,T(2n) ≈ cM(2n)3/3,所以 T(2n)/T(n) ≈ 8
2021/3/27
CHENLI
10
习题3.2-6,P82
• 6. 设文本T长度为n,模式P长度为m,给 出一个蛮力字符串匹配最差的实例,并指 出精确的比较次数
– 解:令T为长度为n个0的字符串,P的前m-1个 字符为0,第m个字符为1,此时总的比较次数 最多,结果为 C(n)=m(n-m+1),当m<<n时,有 C(n)∈Θ(nm)

东北师范大学奥鹏算法分析与设计20春在线作业2标准答案

东北师范大学奥鹏算法分析与设计20春在线作业2标准答案
C.编译器
D.调解器
正确答案:A
3.int atoi(char *s)函数的作用是()。
A.整数转换为字符串
B.字符串转换为整数
C.字符转换为字符串
D.获取字符个数
正确答案:B
4.下列排序算法中,其中()是稳定的。
A.堆排序,冒泡排序
B.快速排序,堆排序
C.直接选择排序,归并排序
D.归并排序,冒泡排序
B.递归策略
C.递归出口
D.递归返回
正确答案:C
16.“二分法”和“牛顿迭代法”属于()。
A.递推法
B.穷举法
C.近似迭代法
D.动态规划法
正确答案:C
17.一个算法的评价主要从时间复杂度和()来考虑。
A.空间复杂度
B.算法有效性
C.算法有穷性
D.算法可读性
正确答案:A
18.下面关于二分查找的叙述正确的是()
A.VS
B.VM
C.Dev-C++
D.IDE
正确答案:A
8.下面4句话中,最准确的表述是()。
A.程序=算法+数据结构
B.程序是使用编程语言实现算法
C.程序的开发方法决定算法设计
D.算法是程序设计中最关键的因素
正确答案:A
9.执行memset(s,'a',4)后,s的值为()。
A."aaaa"
B."a4"
按“先进后出”原则组织数据的数据结构是队列。
A.错误
B.正确
正确答案:A
6.一个算法有零个或多个输入。
A.错误
B.正确
正确答案:B
7.算法的空间复杂度是指算法需要消耗的空间资源。

十六皇后-《算法分析与设计》作业报告

十六皇后-《算法分析与设计》作业报告

十六皇后问题【问题描述】八皇后问题,是一个古老而著名的问题,是回溯算法的典型案例。

该问题是国际西洋棋棋手马克斯·贝瑟尔于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)。

算法步骤如下:。

北航研究生 算法设计与分析大作业一

北航研究生 算法设计与分析大作业一

一、请安排投资计划,使总的利润最大。

写出你所设的状态变量、决策变量、状态转移方程与递推关系式,和手工求解的详细步 骤及结果。

解:设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万元。

中科大算法设计与分析分布式算法部分作业部分答案

中科大算法设计与分析分布式算法部分作业部分答案
算法设计与分析 第二次作业
1. 分析在同步和异步模型下汇集算法的复杂性。 分析在同步和异步模型下பைடு நூலகம்集算法的复杂性。
解:与广播算法分析时间复杂性的步骤一致,一两句的说明 与广播算法分析时间复杂性的步骤一致, 不是分析。 不是分析。 <1> 同步模型 引理:在汇集算法的每个容许执行里, 引理:在汇集算法的每个容许执行里,树中每个高为 t 轮里收到所有孩子的msg。 子树根结点在第 t 轮里收到所有孩子的msg。 归纳证明。。。 归纳证明。。。 定理:当生成树高为 d 时,存在一个时间复杂度为O(d)的 定理: 存在一个时间复杂度为O(d)的 同步汇集算法。 同步汇集算法。 <2> 异步模型 引理:在汇集算法的每个容许的执行里, 引理:在汇集算法的每个容许的执行里,树中每个高为 t 收到所有孩子的msg。 的子树根结点在时刻 t 收到所有孩子的msg。 归纳证明。。。 归纳证明。。。 定理: 存在一个时间复杂度为O(d)的 定理:当生成树高为 d 时,存在一个时间复杂度为O(d)的 异步汇集算法。 异步汇集算法。
6.
证明同步环上不存在匿名的、 证明同步环上不存在匿名的、一致性的 Leader选举算法 Leader选举算法。 选举算法。
解:由Lemma3.1可得。 解:由Lemma3.1可得。 假设R是大小为n>1的环(非均匀),A 假设R是大小为n>1的环(非均匀),A是其上的一 个匿名算法,它选中某处理器为leader。因为环是 个匿名算法,它选中某处理器为leader。因为环是 同步的且只有一种初始配置,故在R 同步的且只有一种初始配置,故在R上A只有唯一的 合法执行。 Lemma3.1: 在环R上算法A Lemma3.1: 在环R上算法A的容许执行里,对于每 轮k,所有处理器的状态在第k轮结束时是相同的。 ,所有处理器的状态在第k Note:每个处理器同时宣布自己是Leader! Note:每个处理器同时宣布自己是Leader!
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

最接近点对问题问题此问题分为一维,二维,三维的情况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 中的每一个点的距离:这个问题是此问题的关键。

首先要考虑的是,1s 中的点,是不是每一个都有可能和2s 中的某个点组成最接近点呢。

答案是未必。

假设中线的横坐标是x.而1d 2d 中较小的值为d 。

则1s 中距离中线大于d 的点,它和2s 中任意点的距离必定大于d 。

所以,只用考虑符合(X-1x <d )的点即可。

其中1x 为点的横坐标。

然后要考虑的是,对于每个中距离中线小于d 的点,是不是2s 中的每个点都有可能和其组成最接近点呢?答案也是未必。

假设一个1s 中距离中线小于d 的点为1n ,它的纵坐标为y ,那么2s 中距离1n 小于于d 的点,它的纵坐标和y 之差的绝对值必然小于d 。

即一定在下图阴影部分之中。

在下图中,我们观察到:将阴影部分分成6块,每块顶多有一个点。

否则,任意一块中的两个点,即小于d ,这和d 的定义矛盾。

至此,我们得到结论,不是每个2s 中的点都需要计算的。

我们只需要计算1s 中距离中线x 不超过d 的点和与此点对应的符合阴影部分的2s 中的点。

4. 在第三步中的所有距离中得到一个最小距离3d ,和1d 2d 相比之后,得出最终答案。

4. 现在要考虑的是这个算法和基本算法的2()O n 的时间复杂度相比,它有优越性么?假设问题的规模为n ,在这个算法中,它的分割步骤和合并步骤总共耗时()O n 。

因此,算法耗费的计算时间为()T n 满足递归方程(1)4()2(/2)()4O n T n T n O n n <⎧=⎨+≥⎩解此方程得T(n)=(log )O n n 。

源代码因课本上的关键代码是用C++编写的。

本人不善于用C++,故进行修改并用C 实现。

#include <stdio.h> #include <math.h> #define MAX 50int point1,point2,x[MAX]; float point[MAX][2];float distance(int a,int b) {//两点间距离 float dx,dy; dx=point[a][0]-point[b][0]; dy=point[a][1]-point[b][1]; return (sqrt(dx*dx+dy*dy)); }void record(int a,int b){//用point1,point2来记录最接近点的编号。

if (point1==-1){point1=a;point2=b;} else if (distance(a,b)<distance(point1,point2)) { point1=a; point2=b; } }float closest(int m,int n) {//分治法求最接近距离 float d,d1,d2,mid; int i,j,k; if ((n-m)==1) { d=distance(x[m],x[n]); record(x[m],x[n]); return d; } if ((n-m)==2) { d=distance(x[m],x[m+1]); d1=distance(x[m],x[n]); d2=distance(x[m+1],x[n]); if (d<=d1&&d<=d2) {record(x[m],x[m+1]); return d;} if (d1<=d&&d1<=d2) {record(x[m],x[n]); return d1;} if (d2<=d&&d2<=d1) {record(x[m+1],x[n]); return d2;} }//多于点的情况用分治法 k=(m+n)/2; d1=closest(m,k); d2=closest(k+1,n); if (d1<d2)d=d1; else d=d2; mid=(point[k][0]+point[k+1][0])/2; for (i=m;i<=k;i++) {if(point[x[i]][0]<mid-d)continue;//左边部分离中线距离大于d的被排除for(j=n;j>=k+1;j--){if(point[x[j]][0]>mid+d)continue;//右边部分离中线距离大于d的被排除if(abs(point[x[j]][1]-point[x[i]][1])>d)continue;//右边部分纵坐标离左边所选点纵坐标的距离大于d的被排除d1=distance(x[i],x[j]);if(d1<d){record(x[i],x[j]);d=d1;}}}return d;}void arrange(int n){//对x[]进行赋值,赋值为以点的横坐标从小到大排列的点的序号float x1[MAX],tem1;int tem;int i,j;for(i=0;i<n;i++)x1[i]=point[i][0];for(i=0;i<n;i++)x[i]=i;for(i=0;i<n-1;i++){for(j=0;j<n-1-i;j++){if(x1[j]>x1[j+1]){tem1=x1[j];x1[j]=x1[j+1];x1[j+1]=tem1;tem=x[j];x[j]=x[j+1];x[j+1]=tem;}}}}int main(void){float x1[MAX],tem1;int i,j,n,tem;float a,b,d;point1=-1;//录入点的数据*****printf("请输入点的个数(为大于等于的自然数):");scanf("%d",&n);for(i=0;i<n;i++){printf("请输入点的横坐标和纵坐标,中间用空格分开:");scanf("%f %f",&a,&b);point[i][0]=a;point[i][1]=b;}//******************arrange(n);d=closest(0,n-1);printf("最接近点对为第%d个点和第%d个点",point1+1,point2+1);printf("其距离为%.5f\n",d);system("pause");return 0;}测试数据及运行结果为验证程序的正确性,特寻找几组独特的数据进行检测观察以上测试,基本符合题意要求。

但此程序仅得到一个最接近点对,若出现相等的情况,只给出其中一个。

调试心得和源程序源程序在源代码部分已经给出。

在调试过程中,我发现对于数组地址的传递比较容易出错,鉴于时间问题,只好采取设置全局变量的办法解决了问题。

另:本程序几乎被我重新编写,和书中的代码有巨大的差异,但算法思想是一致的。

算法分析题:1.1求下列函数的渐近表达式:()T n =2310n n +的渐近表达式()Tn =23n . ()T n =2/102n n +的渐近表达式为()T n =2n . ()T n =21+1/n 的渐近表达式为()Tn =21. ()T n =3log n 的渐近表达式为()Tn =3log n . ()T n =10log3n 的渐近表达式为()T n =log310n ∙. 1.2试论(1)O ,(2)O 的区别。

因为: (1)O +(1)O =(11)O +=(2)O (1)O +(1)O ==(1)O . 所以,(1)O ,(2)O 应该是相等的。

1.3 按照渐近阶从低到高的顺序排列以下表达式:24n ,log n ,3n ,20n , 2,2/3n .又!n 应该排在哪一位?从低到高:2,log n ,20n ,2/3n,24n ,3n,!n2.2 下面的7个算法与本章中的二分搜索算法Binary Search 略有不同。

请判断这7个算法的正确性。

如果算法不正确,请说明产生错误的原因。

如果算法正确,请给出算法的正确性证明1. while (left<=right){ int middle=(left+right)/2;if (x==a[middle])return middle; if (x>a[middle])left=middle; else right=middle; }return -1;不正确,当循环进行到只有两个元素的时候,int middle=(left+right)/2,就等于那个较小的元素位置。

这时如果X 大于较小的元素的时候,即if(x>a[middle])left=middle;就造成了下次循环还是两个元素,这就形成了死循环。

相关文档
最新文档