算法部分作业答案要点

合集下载

算法练习题及答案

算法练习题及答案

算法练习题及答案算法练习题及答案随着计算机科学的发展,算法成为了计算机科学的核心内容之一。

算法是一种解决问题的方法和步骤,它可以将复杂的问题简化为一系列简单的操作。

为了提高算法设计和分析的能力,许多学生和程序员经常进行算法练习。

在这篇文章中,我将给出一些常见的算法练习题及其答案,希望能对读者有所帮助。

1. 反转字符串题目:给定一个字符串,将其反转并返回。

解答:可以使用两个指针,一个指向字符串的开头,一个指向字符串的末尾。

然后交换两个指针指向的字符,然后分别向中间靠拢,直到两个指针相遇。

2. 判断回文数题目:给定一个整数,判断它是否是回文数。

回文数是指正序和倒序读都一样的整数。

解答:可以将整数转换为字符串,然后使用反转字符串的方法判断是否相等。

另一种方法是将整数反转后与原来的整数进行比较。

3. 寻找两个有序数组的中位数题目:给定两个有序数组,找出这两个数组合并后的中位数。

要求时间复杂度为O(log(m+n))。

解答:可以使用二分查找的思想。

首先将两个数组合并成一个有序数组,然后找到中位数的位置。

如果数组长度为奇数,中位数就是中间的元素;如果数组长度为偶数,中位数就是中间两个元素的平均值。

4. 搜索旋转排序数组题目:给定一个按照升序排列的整数数组,经过旋转后的数组,搜索一个给定的目标值。

如果目标值存在于数组中,则返回它的索引,否则返回-1。

解答:可以使用二分查找的思想。

首先找到数组的中间元素,然后判断中间元素与目标值的关系。

如果中间元素等于目标值,直接返回索引;如果中间元素小于目标值,说明目标值在右半部分,继续在右半部分进行二分查找;如果中间元素大于目标值,说明目标值在左半部分,继续在左半部分进行二分查找。

5. 最长公共前缀题目:给定一个字符串数组,找到这些字符串的最长公共前缀。

解答:可以将第一个字符串作为初始的最长公共前缀,然后逐个比较后面的字符串与最长公共前缀的相同部分。

如果相同部分为空,则返回空;如果相同部分不为空,则更新最长公共前缀。

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

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

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

第一部分为”客观题部分”, 由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、请写出批处理作业调度的回溯算法。

《算法设计与分析基础(第3版)》第一,二章部分习题答案

《算法设计与分析基础(第3版)》第一,二章部分习题答案

作业一学号:_____ 姓名:_____说明:1、正文用宋体小四号,1.5倍行距。

2、报告中的图片、表格中的文字均用宋体五号,单倍行距。

3、图片、表格均需要有图片编号和标题,均用宋体五号加粗。

4、参考文献用宋体、五号、单倍行距,请参照参考文献格式国家标准(GB/T 7714-2005)。

5、公式请使用公式编辑器。

P144.用伪代码写一个算法来求方程ax2+bx+c=0的实根,a,b,c 是任意实系数。

(可以假设sqrt(x)是求平方根的函数。

)算法:Equate(a,b,c)//实现二元一次方程求解实数根//输入:任意系数a,b,c//输出:方程的实数根x1,x2或无解If a≠0p←b2−4acIf p>0x1←−b+sqrt(p)2ax2←−b−sqrt(p)2areturn x1,x2else if p=0return −b2aelsereturn “no real roots”elseif b≠0return −cbelseif c≠0return “no real numbers”elsereturn “no real roots”5.写出将十进制正整数转换为二进制整数的标准算法。

a.用文字描述。

b.用伪代码描述。

a.解:输入:一个正整数n输出:正整数n相应的二进制数第一步:用n 除以2,余数赋给K[i](i=0,1,2...),商赋给n第二步:如果n=0 ,则到第三步,否则重复第一步第三步:将K[i]按照i从高到低的顺序输出b.解:算法:DecToBin(n)//实现正整数十进制转二进制//输入:一个正整数n//输出:正整数n对应的二进制数组K[0..i]i ←1while n≠0 doK[i]←n%2n←(int)n/2i ++while i≠0doprint K[i]i - -p462.请用O,Ω 和θ的非正式定义来判断下列断言是真还是假。

a. n(n+1)/2∈O(n3)b. n(n+1)/2∈O(n2)c. n(n+1)/2∈θ(n3)d. n(n+1)/2∈Ω(n)解:断言为真:a,b,d断言为假:cP535.考虑下面的算法。

算法分类题库及答案详解

算法分类题库及答案详解

算法分类题库及答案详解1. 算法按其设计方法可以分为哪几类?A. 暴力解法B. 贪心算法C. 分治算法D. 动态规划E. 所有以上答案:E2. 以下哪个算法不属于贪心算法?A. 活动选择问题B. 最小生成树C. 快速排序D. 霍夫曼编码答案:C3. 分治算法的基本思想是什么?A. 将问题分解成更小的子问题B. 直接求解问题C. 选择最优子问题D. 迭代求解答案:A4. 动态规划与分治算法的主要区别是什么?A. 动态规划需要存储中间结果B. 分治算法需要存储中间结果C. 动态规划不需要分解问题D. 分治算法不需要分解问题答案:A5. 暴力解法通常用于什么问题?A. 问题规模较小B. 问题规模较大C. 需要最优解D. 需要近似解答案:A6. 以下哪个算法是使用贪心算法解决的?A. 汉诺塔问题B. 旅行商问题C. 背包问题D. 八皇后问题答案:C7. 快速排序算法属于哪种算法类别?A. 暴力解法B. 贪心算法C. 分治算法D. 动态规划答案:C8. 动态规划通常用于解决什么问题?A. 线性问题B. 组合问题C. 排序问题D. 查找问题答案:B9. 以下哪个问题可以通过贪心算法得到最优解?A. 旅行商问题B. 背包问题C. 0/1背包问题D. 所有以上答案:B10. 汉诺塔问题通常使用什么算法解决?A. 暴力解法B. 贪心算法C. 分治算法D. 动态规划答案:C11. 以下哪个算法是动态规划算法的典型应用?A. 斐波那契数列B. 最长公共子序列C. 最短路径问题D. 所有以上答案:D12. 贪心算法在哪些情况下可能无法得到最优解?A. 问题具有最优子结构B. 问题不具有最优子结构C. 问题具有重叠子问题D. 问题不具有重叠子问题答案:B13. 动态规划算法的一般步骤是什么?A. 确定状态B. 确定状态转移方程C. 确定边界条件D. 所有以上答案:D14. 分治算法的一般步骤包括哪些?A. 分解问题B. 解决子问题C. 合并子问题的解D. 所有以上答案:D15. 以下哪个算法不是排序算法?A. 冒泡排序B. 选择排序C. 快速排序D. 霍夫曼编码答案:D16. 快速排序算法的时间复杂度在最坏情况下是多少?A. O(n log n)B. O(n^2)C. O(n)D. O(1)答案:B17. 动态规划算法在解决什么问题时会使用记忆化搜索?A. 线性问题B. 组合问题C. 排序问题D. 查找问题答案:B18. 贪心算法在选择策略时通常遵循什么原则?A. 选择当前最优B. 选择全局最优C. 选择随机D. 选择平均最优答案:A19. 以下哪个问题不适合使用贪心算法?A. 单源最短路径问题B. 旅行商问题C. 背包问题D. 霍夫曼编码答案:B20. 分治算法在解决哪些问题时特别有效?A. 线性问题B. 组合问题C. 排序问题D. 查找问题答案:B。

算法设计与分析复习题目及答案 (3)

算法设计与分析复习题目及答案 (3)

分治法1、二分搜索算法是利用(分治策略)实现的算法。

9. 实现循环赛日程表利用的算法是(分治策略)27、Strassen矩阵乘法是利用(分治策略)实现的算法。

34.实现合并排序利用的算法是(分治策略)。

实现大整数的乘法是利用的算法(分治策略)。

17.实现棋盘覆盖算法利用的算法是(分治法)。

29、使用分治法求解不需要满足的条件是(子问题必须是一样的)。

不可以使用分治法求解的是(0/1背包问题)。

动态规划下列不是动态规划算法基本步骤的是(构造最优解)下列是动态规划算法基本要素的是(子问题重叠性质)。

下列算法中通常以自底向上的方式求解最优解的是(动态规划法)备忘录方法是那种算法的变形。

(动态规划法)最长公共子序列算法利用的算法是(动态规划法)。

矩阵连乘问题的算法可由(动态规划算法B)设计实现。

实现最大子段和利用的算法是(动态规划法)。

贪心算法能解决的问题:单源最短路径问题,最小花费生成树问题,背包问题,活动安排问题,不能解决的问题:N皇后问题,0/1背包问题是贪心算法的基本要素的是(贪心选择性质和最优子结构性质)。

回溯法回溯法解旅行售货员问题时的解空间树是(排列树)。

剪枝函数是回溯法中为避免无效搜索采取的策略回溯法的效率不依赖于下列哪些因素(确定解空间的时间)分支限界法最大效益优先是(分支界限法)的一搜索方式。

分支限界法解最大团问题时,活结点表的组织形式是(最大堆)。

分支限界法解旅行售货员问题时,活结点表的组织形式是(最小堆)优先队列式分支限界法选取扩展结点的原则是(结点的优先级)在对问题的解空间树进行搜索的方法中,一个活结点最多有一次机会成为活结点的是( 分支限界法).从活结点表中选择下一个扩展结点的不同方式将导致不同的分支限界法,以下除( 栈式分支限界法)之外都是最常见的方式.(1)队列式(FIFO)分支限界法:按照队列先进先出(FIFO)原则选取下一个节点为扩展节点。

(2)优先队列式分支限界法:按照优先队列中规定的优先级选取优先级最高的节点成为当前扩展节点。

算法测试题及答案

算法测试题及答案

算法测试题及答案一、选择题1. 以下哪个选项不是排序算法?A. 冒泡排序B. 选择排序C. 快速排序D. 深度优先搜索答案:D2. 在二叉树中,深度为5的节点最多有多少个?A. 16B. 32C. 64D. 31答案:D二、填空题1. 递归算法的基本思想是 _ ,即把问题分解成相同但规模更小的问题。

答案:分而治之2. 动态规划与分治法的不同之处在于动态规划会 _ ,而分治法则不会。

答案:存储子问题的解三、简答题1. 请简述什么是贪心算法,并给出一个例子。

答案:贪心算法是一种在每一步选择中都采取在当前状态下最好或最优的选择,从而希望导致结果是全局最好或最优的算法策略。

例如,活动选择问题,给定一系列活动,每个活动都有一个开始时间和结束时间,贪心算法会按照结束时间的早晚来选择活动,从而最大化参与活动的数量。

2. 描述快速排序算法的基本思想。

答案:快速排序算法是一种分治策略,基本思想是选择一个元素作为“基准”(pivot),然后将数组分为两个子数组,一个包含所有小于基准的元素,另一个包含所有大于基准的元素。

这个过程称为分区(partitioning)。

之后,递归地将分区过程应用到两个子数组上,直到每个子数组只有一个元素或为空。

四、计算题1. 给定一个数组 [3, 1, 4, 1, 5, 9, 2, 6, 5, 3, 5],请使用快速排序算法对其进行排序,并给出排序后的数组。

答案:使用快速排序算法对给定数组进行排序后,得到的数组为 [1, 1, 2, 3, 3, 4, 5, 5, 5, 6, 9]。

2. 假设有一个二叉搜索树,其根节点的值为10,现在要删除值为5的节点,请描述删除过程。

答案:删除二叉搜索树中的节点分为三种情况:- 情况1:要删除的节点没有子节点,直接删除该节点。

- 情况2:要删除的节点只有一个子节点,用其子节点替换该节点。

- 情况3:要删除的节点有两个子节点,找到该节点的直接前驱或直接后继,用其值替换要删除的节点,然后删除直接前驱或直接后继。

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

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

算法分析与设计作业及参考答案作业题目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. 什么是算法?算法是一系列解决问题的步骤和规则。

它描述了如何将输入转换为输出,并在有限的时间内完成。

算法应具备正确性、可读性、健壮性和高效性等特点。

2. 如何分析算法的效率?算法的效率可以通过时间复杂度和空间复杂度来衡量。

时间复杂度表示算法执行所需的时间量级,常用的时间复杂度有O(1)、O(n)、O(logn)、O(nlogn)和O(n^2)等。

空间复杂度表示算法执行所需的额外空间量级,通常以字节为单位。

3. 什么是渐进符号?渐进符号用于表示算法的时间复杂度或空间复杂度的增长趋势。

常见的渐进符号有大O符号、Ω符号和Θ符号。

大O符号表示算法的上界,Ω符号表示算法的下界,Θ符号表示算法的平均情况。

4. 什么是分治法?分治法是一种算法设计策略,将问题分解为若干个子问题,并对子问题进行独立求解,最后将子问题的解合并得到原问题的解。

典型的分治算法有归并排序和快速排序。

5. 什么是动态规划?动态规划是一种通过将问题分解为相互重叠的子问题来求解的方法。

它通常用于求解具有重叠子问题和最优子结构性质的问题。

典型的动态规划算法有背包问题和最短路径问题。

6. 什么是贪心算法?贪心算法是一种通过每一步选择局部最优解来求解整体最优解的方法。

贪心算法通常不能保证得到全局最优解,但在某些问题上能够得到近似最优解。

典型的贪心算法有霍夫曼编码和最小生成树算法。

7. 什么是图算法?图算法是一类用于解决图结构相关问题的算法。

图由节点和边组成,节点表示对象,边表示对象之间的关系。

图算法包括图的遍历、最短路径、最小生成树和网络流等问题的求解。

8. 什么是NP完全问题?NP完全问题是一类在多项式时间内无法求解的问题。

算法分析习题参考答案第四章

算法分析习题参考答案第四章

第四章作业 部分参考答案1. 设有n 个顾客同时等待一项服务。

顾客i 需要的服务时间为n i t i ≤≤1,。

应该如何安排n 个顾客的服务次序才能使总的等待时间达到最小?总的等待时间是各顾客等待服务的时间的总和。

试给出你的做法的理由(证明)。

策略:对 1i t i n ≤≤进行排序,,21n i i i t t t ≤≤≤ 然后按照递增顺序依次服务12,,...,ni i i 即可。

解析:设得到服务的顾客的顺序为12,,...,n j j j ,则总等待时间为,2)1(121n n j j j j t t t n nt T +++-+=- 则在总等待时间T 中1j t 的权重最大,jn t 的权重最小。

故让所需时间少的顾客先得到服务可以减少总等待时间。

证明:设,21n i i i t t t ≤≤≤ ,下证明当按照不减顺序依次服务时,为最优策略。

记按照n i i i 21次序服务时,等待时间为T ,下证明任意互换两者的次序,T都不减。

即假设互换j i ,)(j i <两位顾客的次序,互换后等待总时间为T ~,则有.~T T ≥由于,))(())(()2)(2()1)(1(21n j i i i i i i t j t j n i t i n t n t n T +--++--++--+--=,))(())(()2)(2()1)(1(~21n i j i i i i i t j t j n i t i n t n t n T +--++--++--+--=则有.0))((~≥--=-i j i i t t i j T T同理可证其它次序,都可以由n i i i 21经过有限次两两调换顺序后得到,而每次交换,总时间不减,从而n i i i 21为最优策略。

2. 字符h a ~出现的频率分布恰好是前8个Fibonacci 数,它们的Huffman 编码是什么?将结果推广到n 个字符的频率分布恰好是前n 个Fibonacci 数的情形。

algorithms 习题答案

algorithms 习题答案

algorithms 习题答案算法是计算机科学中的重要概念,它是一种解决问题的方法和步骤的有序集合。

在学习算法的过程中,习题是不可或缺的一部分。

通过解答习题,我们可以加深对算法的理解,提高我们的编程能力。

在本文中,我将为大家提供一些常见算法习题的答案。

一、排序算法1. 冒泡排序冒泡排序是一种简单但效率较低的排序算法。

它的基本思想是通过相邻元素的比较和交换,将最大的元素逐渐“冒泡”到数组的末尾。

以下是冒泡排序的实现代码:```pythondef bubble_sort(arr):n = len(arr)for i in range(n-1):for j in range(n-i-1):if arr[j] > arr[j+1]:arr[j], arr[j+1] = arr[j+1], arr[j]return arr```2. 快速排序快速排序是一种常用的排序算法,它的基本思想是通过选择一个基准元素,将数组分为两部分,一部分小于基准元素,一部分大于基准元素,然后对这两部分分别进行递归排序。

以下是快速排序的实现代码:```pythondef quick_sort(arr):if len(arr) <= 1:return arrpivot = arr[0]left = [x for x in arr[1:] if x <= pivot]right = [x for x in arr[1:] if x > pivot]return quick_sort(left) + [pivot] + quick_sort(right)```二、查找算法1. 二分查找二分查找是一种高效的查找算法,它的基本思想是将有序数组分为两部分,通过与目标值的比较,确定目标值在哪一部分中,然后再在该部分中进行查找。

以下是二分查找的实现代码:```pythondef binary_search(arr, target):left, right = 0, len(arr) - 1while left <= right:mid = (left + right) // 2if arr[mid] == target:return midelif arr[mid] < target:left = mid + 1else:right = mid - 1return -1```2. 哈希查找哈希查找是一种基于哈希表的查找算法,它的基本思想是通过将关键字映射到哈希表中的位置,从而快速定位到目标值。

算法题库及答案高中生

算法题库及答案高中生

算法题库及答案高中生1. 二分查找算法- 问题描述:在一个已排序的数组中,使用二分查找算法找出一个特定元素的位置。

- 算法步骤:- 确定数组的中间位置。

- 比较中间元素与目标值。

- 如果目标值等于中间元素,则查找成功。

- 如果目标值小于中间元素,则在左半部分继续查找。

- 如果目标值大于中间元素,则在右半部分继续查找。

- 重复以上步骤,直到找到目标值或搜索范围为空。

- 答案:二分查找的时间复杂度为O(log n),适用于已排序的数组。

2. 快速排序算法- 问题描述:快速排序是一种分治算法,用于对数组进行排序。

- 算法步骤:- 选择一个元素作为“基准”。

- 重新排列数组,使得所有比基准小的元素都在基准的左边,所有比基准大的元素都在基准的右边。

- 递归地将上述步骤应用于基准左边和右边的子数组。

- 答案:快速排序的平均时间复杂度为O(n log n),但在最坏情况下为O(n^2)。

3. 归并排序算法- 问题描述:归并排序是一种分治算法,用于对数组进行排序。

- 算法步骤:- 将数组分成两半,直到每个子数组只有一个元素。

- 将两个有序的子数组合并成一个有序数组。

- 重复以上步骤,直到整个数组有序。

- 答案:归并排序的时间复杂度为O(n log n),并且是稳定的排序算法。

4. 深度优先搜索(DFS)- 问题描述:在图或树中,深度优先搜索用于遍历所有节点。

- 算法步骤:- 从根节点开始,沿着一个分支尽可能深地搜索。

- 当无法继续深入时,回溯并沿着其他分支继续搜索。

- 答案:DFS可以用于解决路径搜索问题,如迷宫求解或图的连通性问题。

5. 广度优先搜索(BFS)- 问题描述:在图或树中,广度优先搜索用于遍历所有节点。

- 算法步骤:- 从根节点开始,逐层遍历所有节点。

- 使用队列来保持访问顺序。

- 答案:BFS常用于寻找最短路径或解决最短路径问题。

6. 动态规划算法- 问题描述:动态规划是一种解决复杂问题的方法,通常用于求解优化问题。

2019-2020学年第一学期期末考试《计算方法》大作业答案

2019-2020学年第一学期期末考试《计算方法》大作业答案

吉林大学网络教育学院2019-2020学年第一学期期末考试《计算方法》大作业答案学生姓名专业层次年级学号学习中心成绩年月日作业完成要求:大作业要求学生手写,提供手写文档的清晰扫描图片,并将图片添加到word文档内,最终wod文档上传平台,不允许学生提交其他格式文件(如JPG,RAR等非word文档格式),如有雷同、抄袭成绩按不及格处理。

一、解线性方程(每小题8分,共80分)1、用矩阵的LU分解算法求解线性方程组X1+2X2+3X3= 02X1+2X2+8X3= -4-3X1-10X2-2X3= -11答:2、用矩阵的Doolittle分解算法求解线性方程组X1+2X2+3X3= 12X1– X2+9X3= 0-3X1+ 4X2+9X3= 1答:3、用矩阵的Doolittle分解算法求解线性方程组2X1+X2+X3= 46X1+4X2+5X3=154X1+3X2+6X3= 13答:4、用高斯消去法求解线性方程组2X1- X2+3X3= 24X1+2X2+5X3= 4-3X1+4X2-3X3= -3答:5、用无回代过程消元法求解线性方程组2X1- X2+3X3= 24X1+2X2+5X3= 4-3X1+4X2-3X3= -3答:6、用主元素消元法求解线性方程组2X1- X2+3X3= 24X1+2X2+5X3= 4-3X1+4X2-3X3= -3答:7、用高斯消去法求解线性方程组1231231232344272266x x x x x x x x x -+=++=-++=答:8、利用Doolittle 分解法解方程组Ax=b ,即解方程组12341231521917334319174262113x x x x -⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥-⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥--⎢⎥⎢⎥⎢⎥--⎣⎦⎣⎦⎣⎦ 答:9、利用Doolittle 分解法解方程组Ax=b ,即解方程组123421111443306776081011112x x x x ⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥=⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥-⎣⎦⎣⎦⎣⎦ 答:10、用高斯消元法解方程组1237811351341231x x x -⎡⎤⎡⎤⎡⎤⎢⎥⎢⎥⎢⎥-=-⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎢⎥⎣⎦⎣⎦⎣⎦答案:二、计算(每小题10分,共20分)1、已知节点x1,x2及节点处函数值f(x1),f(x2),构造线性插值多项式p1(x). 答:2、设f(xi)=i(i=0,1,2),构造二次式p2(x),使满足: p2(xi)=f(xi)(i=0,1,2)答:。

算法考卷参考答案

算法考卷参考答案

一、选择题(每题1分,共5分)A. Dijkstra算法B. Kruskal算法C. Huffman编码D. 动态规划算法2. 下列排序算法中,哪个算法的时间复杂度最稳定?A. 冒泡排序B. 快速排序C. 堆排序D. 插入排序A. 二分查找B. 深度优先搜索C. 广度优先搜索D. 动态规划A. 初始化状态B. 确定状态转移方程C. 计算最优值D. ABC都是A. Floyd算法B. Warshall算法C. Prim算法D. BellmanFord算法二、判断题(每题1分,共5分)1. 算法的空间复杂度与时间复杂度成正比。

(×)2. 贪心算法总能得到最优解。

(×)3. 快速排序的平均时间复杂度为O(nlogn)。

(√)4. 二分查找算法适用于顺序存储的有序表。

(√)5. 深度优先搜索和广度优先搜索在遍历图时,时间复杂度相同。

(×)三、填空题(每题1分,共5分)1. 算法的五个基本特性分别是:可行性、确定性、______、有穷性和输入输出。

2. 在排序算法中,堆排序的时间复杂度为______。

3. 求解背包问题通常采用______算法。

4. 图的遍历方法有深度优先搜索和______。

5. 在动态规划算法中,状态转移方程描述了______之间的关系。

四、简答题(每题2分,共10分)1. 简述冒泡排序的基本思想。

2. 什么是贪心算法?请举例说明。

3. 简述二分查找算法的基本步骤。

4. 什么是动态规划算法?它适用于哪些问题?5. 请列举三种常见的图遍历算法。

五、应用题(每题2分,共10分)1. 设有数组arr = [3, 5, 1, 4, 2],请用冒泡排序算法对数组进行排序。

2. 给定一个整数数组nums,请找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。

3. 编写一个递归函数,实现求斐波那契数列的第n项。

A B| |C DA B (3)| |C D (4)六、分析题(每题5分,共10分)def func(n):sum = 0for i in range(n):for j in range(i):sum += 1return sum2. 给定一个字符串str,请设计一个算法,找出最长不重复子串的长度。

算法试题及答案

算法试题及答案

算法试题及答案一、选择题1. 以下哪个选项不是排序算法?A. 快速排序B. 归并排序C. 冒泡排序D. 深度优先搜索答案:D2. 在二叉树的遍历算法中,中序遍历的顺序是什么?A. 根-左-右B. 左-根-右C. 右-根-左D. 根-右-左答案:B二、填空题1. 在图论中,一个图中的顶点数为n,边数为m,那么这个图的邻接矩阵的维度是________。

答案:n×n2. 动态规划算法的核心是________。

答案:最优子结构三、简答题1. 请简述贪心算法和动态规划算法的区别。

答案:贪心算法在每一步选择局部最优解,而不考虑全局最优解;动态规划算法则是将问题分解成子问题,通过求解子问题的最优解来构建原问题的最优解。

2. 什么是分治算法?请举例说明。

答案:分治算法是一种递归算法,它将问题分解成更小的子问题,递归求解子问题,然后将子问题的解合并以得到原问题的解。

例如,快速排序就是一种分治算法,它通过选择一个基准值,将数组分成两部分,一部分比基准值小,另一部分比基准值大,然后递归地对这两部分进行快速排序。

四、编程题1. 编写一个函数,实现字符串的反转。

答案:```pythondef reverse_string(s):return s[::-1]```2. 给定一个整数数组,请编写一个函数,找出数组中第二大的数。

答案:```pythondef find_second_max(nums):first_max = second_max = float('-inf')for num in nums:if num > first_max:second_max = first_maxfirst_max = numelif num > second_max and num != first_max:second_max = numreturn second_max```。

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

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

《算法分析与设计》作业参考答案作业一一、名词解释: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+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.设计一个分治算法计算一棵二叉树的高度。

数据结构与算法第二章作业答案

数据结构与算法第二章作业答案

方法一:
void Move_MAX(LinkList &L) {
q=L; p=L->next;
while(p) {
if(p->data>q->data) q=p;
p=p->next;
}//while循环,q指向最大值结点
if(q!=L) {
s=L; while(s->next!=q) s=s->next;//s指向q的直接前驱
q->next=NULL
L

35
67
18
52
s
值最大的结点不是首元结点
90 ∧ 14
q
s->next=q->next
71

82 65 ^
r
r->next=q
L=q->next
L

135 ∧ 67
18
q
52
90
14
71

82 65 ^
r
q->next=NULL
r->next=q
值最大的结点是首元结点
}
r=L; while(r->next) r=r->next; //r指向表尾结点
if(q!=r) {//若q是表尾结点,算法结束
if(q!=L) { //q不是第一个结点
s->next=q->next; r->next=q; q->next=NULL;
}
else { //q是第一个结点
L=q->next;
5. 已知不带头结点的非空线性链表头指针为L,请写一 个算法,将该链表中数据域值最大的那个结点移到链 表的最末端。(作业)

算法部分作业答案

算法部分作业答案
解:
首先,选择最优量度标准为收益重量比;
其次,依据收益重量比的非增次序对输入(物品)进行排序
(p0/w0,p1/w1,p2/w2,p3/w3,p4/w4,p5/w5,p6/w6)=(5,5/3,3,1,6,4.5,3)
对物品排序结果为:4,0,5,2,6,1,3
最后,进行贪心选择:
X=(4) X=(4,0)X=(4,0,5)
=2n2+2n=O(n2)
5-8三分搜索算法的做法是:它先将待查元素X与n/3处的元素比较,然后将X与2n/3处的元素比较,比较的结果或者找到X,或者将范围缩小到原来的n/3
int Search3(int a[],int left,int right,int x)/*递归算法*/
{
int l,u;
if(left<=right)
6,2,3,5,1,0,4
接着执行JS函数:
最初,解集合X为空.
if((r<0||d[x[r]]<=d[j]) && d[j]>r+1){//若条件不满足,选下一个作业
for (int i=k;i>=r+1;i--) x[i+1]=x[i];//将x[r]以后的作业后移
x[r+1]=j; k++;//将作业j插入r+1处
}
}
return k;
}
在执行JS函数之前,必须先对输入(即作业)按作业的收益非增次序排序,结果为:
正确的算法不一定的是健壮的,健壮的算法也不一定是完全正确的.正确性和健壮性是相互补充的.一个可靠的算法,要求能在正常情况下正确的工作,而在异常情况下,亦能做出适当处理.
2-9(1)设计一个C/C++程序,实现一个n*m的矩阵转置,原矩阵与其转置矩阵保存在二维数组中.

算法经典例题及答案.doc

算法经典例题及答案.doc

第三步,判断"NO 是否成立,输入a,6,c-11x 〉10 3、根据・尸,x=10 设计算法并画出程序框图,求输入才的值,输出y 的值.[解析] 第一步:14K10算法如下: 输入x.第二步:如果x>10,那么y= —11;如果才=]0,那么y=0;如果次10,那么y=4;[注意] 算法专题训练1、设计一个程序框图,使之能判断任意输入的整数X 是奇数还是偶数. [解析]程序椎图如下.除以2的余数/输出”是奇数7施出七是偶数7 2、已知关于*的一元二次方程 彩+新+《=0(编制),设计一个算法,判断方程是否有实数根.写出算法步骤,并画出程序框图.[分析]根据3=力=若一4%的符号来判断,因此要用条件结构. [解析]算法如下:第一步,输入缶b, c .第二步,计算3 =廿一4眼・ 若成立,输出方程有实数根;若不成立,输出方程无实数根. 程序框图如下:/输出方程有实数根//输出方程无实数根/~r^输出y 值.使用条件结构,有两种可能则用一个判断框,有三种可能结果则用两个判断框,依此类推.否 是 =1?否是程序框图如下:/输入X /4、如图所示是某函数广(x)给出x的值时,求相应函数值y的程序框图.⑴写出函数广(x)的解析式;⑵若输入的*取X和*2(|为|<|&|)时,输出的*值相同,试简要分析*1与*2的取值范围./输入%]y=x2-1/输出y/JL(结束)[解析]⑴由程序框图知该程序框图执行的功能是求函数73 =成一11的值,故,3的解析式为心= |V—1|.(2)画出f(x)=成一11的草图如下图.由图象的对称性知:要使广3)=广3)旦31<|版|,需一15<1,同时也羽>1或一成WM—1,「•xi的取值范围是以| —, 长的取值范围是{x| 泰或一y[2^x<—l}.5、设计一个算法,找出区间[1,1000]内的能被7整除的整数,画出程序框图.[解析]第一步,取k=\.第二步,判断AW1000是否成立,若不成立,则执行第五步.第三步,若#除以7的余数为0,则输出上第四步,将妇KJ值增加1,返回执行第二步.第五步,结束.程序框图如图.[解析]程序框图如下:6、画出求满足12+22+32+- + /?2>106的最小正整数〃的程序框图.7、国家法定工作II 内,每周工作时间满工作量为40小时,每小时工资8元;如需要加班,则加班时间每小时工资为10元.某人在一周内工作时间为*小时,个人住房公积金、失业险等合计为10%.试画出其净得工资y 元的算法的程序框图.(注:满工作量外的工作时间为加班)[解析]由题意知,当03W40时,乂=8*(1 —10%)=7.2才,7.2x0<xW40 当尤>40 时,r=[40X8+U-40) X10] X (1-10%) =9x-72, :.y=\•9才一72*>40此函数为分段函数,故用条件结构表达,条件为*>40,程序椎图为:8、相传古代印度国王舍罕要褒赏他聪明能干的宰相达依尔(国际象棋的发明者),问他需要什么,达依尔说:“国王只要在国际象棋的棋盘第一格子上放一粒麦子,第二个格子上放两粒,第三个格子上放四粒,以后按此比例每一格加一倍,一直放到第64格(国际象棋8X8 = 64格),我就感恩不尽,其他什么也不要了. ”国王想: “这有多少,还不容易!”让人扛来一袋小麦,但不到一会儿就全用没了,再扛来一袋很快又没有了,结果全印度的粮食用完还不够,国王很奇怪.一个国际象棋棋盘能放多少粒小麦,试用程序框图表示其算法.[分析]根据题目可知:第一个格放1粒=2°,第二个格放2粒=2',第三个格放4粒=2七第.四个格放8粒=23,…,第六十四格放263粒.则此题就转化为求1 + 21+22+23+21+-+263的和的问题.我们可引入一个累加变量S,一个计数变量1 , 累加64次就能算出一共有多少粒小麦.[解析]一个国际象棋棋盘一共能放1+21 + 22+23+21 + -+263粒小麦.程序框图如图所示./ 输His/I J(结束〕9、(1)用辗转相除.法求840与1764的最大公约数.(2)用更相减损术求459与357的最大公约数.[解析]⑴1746=840X2 + 84 840 = 84X10 + 0 所以840与1764的最大公约数为84. (2)459-357=102 357-102=255 255-102=153 153-102 = 51 102-51=51所以459与357的最大公约数为51.10、用秦九韶算法求多项式f3 =/-5/+6? + ^+0. 3好2当*=—2时的值.[解析],: f'3 =/—5/+6^+0 • x+x +0. 3^+2= (((((*—5)x+6)x+0)x+l)x+0. 3)矛+2.••当x=— 2 时,v()=l Ui = —2 —5=—7 处=—7X (―2)+6 = 20 K J =20X (—2) +0 = —40 KI=-40X (一2)+1 = 81 府=81 X (— 2)+0.3 =— 161. 7 ^=-161. 7X (-2)+2 = 325.4A A-2) =325. 4.11、有甲、乙、丙三种溶液分别重147 g, 343 g, 133 g,现要将它们分别全部装入小瓶中,每个小瓶装入液体的质量相同,则每瓶最多装多少溶液?[解析]每个小瓶的溶液的质量应是三种溶液质量147, 343, 133的公约数,最大质量即是其最大公约数. 先求147 与343 的最大公约数:343-147=196, 196—147 = 49, 147 — 49 = 98. 98—49 = 49.所以147与343的最大公约数是49.再求49 与133 的最大公约数:133—49=84, 84-39=35, 49-35 = 14, 35-14 = 21, 21-14=7,14-7=7,所以49与133的最大公约数为7,所以147, 343, 133的最大公约数为7.即每瓶最多装7 g溶液.12、已知175(8)= 120+r,求正整数匕[解析]V 175(8)= 1X82+7X8.1+5X8° = 12.5, A 125=120+r. Ar=5,即所求正整数尸为5.13、已知44(,)= 36,把67(由转化为十进制数.[解析]由题意得36 = 4X^l+4XA°,则k=8,故67a)=67⑻= 6X8' + 7X8°=55.14、把八进制数2011⑻化为五进制数.[分析]|八进制数|-> FF赫阙一百顽薮[解析]2011(8)= 2X83+OX82+1X8, + 1X8°=1 024 + 0 + 8+1 = 1 033.5| 1033 余数5 | 206 35 | 41 15 | 8 15 I 1 30 1A 2011 ⑻= 13113 ⑸.[点评]把一个非十进制数转化为另一个非十进制数,通常是把这个数先转化为十进制数,然后把I•进制数再转化为另一个非十进制数.15、若10pl⑵=湘2(3),求数字*, y的值及与此两数等值的十进制数.[分析]由二进制及三进制可知,ye {0,1), (1, 2},将二进制数和三进制数都转化为十进制数,再由两数相等及x、*的取值范围可得出x、y的值.[解析]V 10/1 ⑵二配?⑶,.-.lX2:i+0X22+yX2+l = ^X32+0X3 + 2,将上式整理得9*—2y=7,7由进位制的性质知, 01,2}, *日{0,1},当尸0时,*=6(舍),当尸]时,x=l.・・・x=ul,已知数为102⑶= 1011⑵,与它们相等的十进制数为1X32+OX3+2 = 11.。

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

中科大算法设计与分析分布式算法部分作业部分答案
算法设计与分析 第二次作业
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.第7页第3题(1)解:逆命题:如果我去公园,则天不下雨;反命题:如果天下雨,则我不去公园;逆反命题:如果我不去公园,则天下雨了。

(2)解:(此题注意:P 仅当Q 翻译成P Q →)逆命题:如果你去,那么我逗留。

反命题:如果我不逗留,那么你没去。

逆反命题:如果你没去,那么我不逗留。

(3)解:逆命题:如果方程n n n x y z +=无整数解,那么n 是大于2的正整数。

反命题:如果n 不是大于2的正整数,那么方程n n n xy z +=有整数解。

逆反命题:如果方程n n n x y z +=有整数解,那么n 不是大于2的正整数。

(4)解:逆命题:如果我不完成任务,那么我不获得更多的帮助。

反命题:如果我获得了更多的帮助,那么我能完成任务。

逆反命题:如果我能完成任务,那么我获得了更多的帮助。

2.第15页第1题(4)解:(())P Q P T ⌝⌝∨→⌝↔()()P Q P Q ⌝∧↔⌝∨⌝()()P Q P Q ⇔⌝∨⌝↔⌝∨⌝ (重言式)(9)解:P P Q F Q T ∧⌝→⇔→⇔(重言式)(10)解:P Q Q T Q Q ∨⌝→⇔→⇔(可满足式)3.第16页第5题(2)证明:(())P Q P ⌝⌝∨→⌝(())()P Q P P Q PP Q PP P QF QF ⇔⌝∨∨⌝⇔⌝∨∧⇔⌝∧⌝∧⇔⌝∧∧⌝⇔∧⌝⇔因此,(())P Q P F ⌝⌝∨→⌝↔,得证。

(4)证明:()()P P P P →⌝∧⌝→()()P P P P P P F⇔⌝∨⌝∧∨⇔⌝∧⇔因此,()()P P P P F →⌝∧⌝→↔,得证。

4.第16页第6题(1)P Q P Q ∧⇒→证明:设P Q ∧为真,那么P 为真,并且Q 为真,因此P Q →为真。

所以P Q P Q ∧⇒→。

(2)()()()P Q R P Q P R →→⇒→→→证明:设()()P Q P R →→→为假,于是P Q →为真,P R →为假。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
return Search3(a, l+1, u-1,x);
else
return Search3(a, left, l-1,x);
}
return -1;
}
void main()
{
int n,*a;
int x,i;
cout<<"Please input n:";
cin>>n;
a=new int[n];//动态数组
1.1算法:是对特定问题求解步骤的一种描述,是指令的有限序列。
程序:当一个算法用某种程序设计语言来描述时,得到的就是程序,也就是说,程序是用某种程序设计语言对算法的具体实现.
算法有输入、输出、确定性、能行性和有限性等特征,当不具备有穷性时,只能叫做计算过程,而不能称之为算法,算法可以终止,而程序没有此限制。
{
int i=0;
count++;
int j=0;
count++;
For(;i<n;i++)
For(;j<m;j++)
{
count++;
b[j][i]=a[i][j];
count++;
}
}
2-10试用定义证明下列等式的正确性
(1) 5n2-8n+2=O(n2)
证明:因为当n0=1,C=6时,当n>n0时,有5n2-8n+2<=6n2
{
For(int i=0;i<n;i++)
For(int j=0;j<m;j++)
b[j][i]=a[i][j];
}
(2)使用全局变量count,改写矩阵转置程序,并运行修改后的程序以确定此程序所需的程序步
Void reverse(int **a,int **b,int n,int m,int &count)
=(T(n-2)+1)+1=((T(n-3)+1)+1)+1=....=T(0)+1+1......+1(n个1)=n
2-19 利用递归树计算递推方程
假设n=2k,那么,总共有logn+1(即k+1)层,非递归部分之和为
n2+n2/21+n2/22+…+n2/2k=(1+1/2+1/22+1/23+…+1/2logn)n2
2-16使用递推关系式计算求n!的递归函数的时间(即分析1-9题中的函数的时间复杂度),要求使用替换和迭代两种方法分别计算之.
解:分析1-9题中的函数的时间复杂度:用基本运算乘法的运算次数作为衡量时间复杂度的量
当n=0时,程序执行if(n==0) return 1;,并没有做乘法,故T(0)=0;当n>=1时程序执行n*Factorial(n-1);此时T(n)=T(n-1)+1故:
}
1-10使用归纳法,证明上题所设计的计算n!的递归函数的正确性
证明(归纳法证明):
(1)首先,如果n=0,那么程序执行
if(n==0)
return 1;
返回1,算法显然正确;
(2)假定函数Factorial对n<k(>1)能正确运行,那么,当n=k时,算法必定执行:
else returnk*Factorial(k-1);
int x,i;
int location=-1;
for(i=0;i<15;i++)
{
a[i]=i+1;
}
cin>>x;
i=0;
int j=14,l,u;
while(i<=j)
{
l=i+(j-i)/3;
u=i+(j-i)*2/3;
if(x==a[u])
{
location=u;
break;
}
else if(x==a[l])
1.2程序证明和程序测试的目的各是什么?
程序证明是确认一个算法能正确无误的工作.
程序测试的目的是发现错误
1-9解:n!的递归定义:
求解n!的递归函数
long Factorial (long n)
{
if(n<0)
{
cout<<”error!”;
exit(0);
}
if(n==0)
return 1;
else return n *Factorial (n-1);
正确的算法不一定的是健壮的,健壮的算法也不一定是完全正确的.正确性和健壮性是相互补充的.一个可靠的算法,要求能在正常情况下正确的工作,而在异常情况下,亦能做出适当处理.
2-9(1)设计一个C/C++程序,实现一个n*m的矩阵转置,原矩阵与其转置矩阵保存在二维数组中.
Void reverse(int **a,int **b,int n,int m)
替换法: T(0)=0,T(1)=1,T(2)=2-----
总结得到:T(n)=n;
归纳法证明:
(1),当n=0时,T(0)=0,结论成立;
(2)假设当k<n时,有 T(k)=k,那么,当k=n时,有T(n)=T(n-1)+1=(n-1)+1=n
所以,对所有n>=0有T(n)=n;成立.
迭代法:
T(n)=T(n-1)+1
因为Factorial(k-1)正确,所以,当n=k时,程序运行正确
综合以上两点,可得程序正确.
证毕.
2-1,简述衡量一个算法的主要性能标准,说明算法的正确性与健壮性的关系
答:衡量一个算法的主要性能指标有:
正确性,简单性,高效低存储,最优性
算法的正确性与健壮性的关系:
所谓算法的正确性:是指在合法的输入下,算法应实现预先规定的功能和计算精度要求;所谓算法的健壮性,是指当输入不合法时,算法应该能按某种预定的方式做出适当的处理;
=2n2+2n=O(n2)
5-8三分搜索算法的做法是:它先将待查元素X与n/3处的元素比较,然后将X与2n/3处的元素比较,比较的结果或者找到X,或者将范围缩小到原来的n/3
int Search3(int a[],int left,int right,int x)/*递归算法*/
{
int l,u;
if(left<=right)
{
l=left+(right-left)/3;
u=left+(right-left)*2/3;
if(x==a[u])
return u;
else if(x==a[l])
return l;
else if(x>a[u])
return Search3(a, u+1, right,x);
else if(x>a[l])
int location=-1;
for(i=0;i<n;i++)
{
a[i]=i+1;
}
cout<<"Please input the search x:";
cin>>x;
cout<<endl<<Search3(a, 0, n-1,x)<<endl;
}
void main()/*非递归算法*/
{
int a[15];
相关文档
最新文档