【完整版】计算机算法期末考试笔记整理(高分必背干货)

计算机算法      ------任课教师:于文,信院小仙女,嘻嘻(如有侵权,请联系我)
主要知识点及练习 ------自己整理的,从老师的PPT上

第一章   概述

算法的基本概念

算法是指解决问题的一种方法或一个过程

算法是若干指令的有穷序列,满足性质:

  1. 输入:有0个或多个由外部提供的量作为算法的输入
  2. 输出:算法产生至少一个量作为输出
  3. 确定性:组成算法的每条指令是清晰,无歧义的
  4. 有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的

语句的频度和算法的时间复杂度

对算法时间的度量用其基本操作重复执行的次数来近似,称为时间复杂度,记作T(n)

 

第二章   递归

分治法的总体思想

将要解决的较大规模的问题不断地分割成更小规模的子问题,直到能够很容易地得到子问题的解

对小规模的问题进行求解

将小问题的解合并为一个更大规模的问题的解,自底向上逐步求出原来问题的解

分割、求解、合并

分治和递归的关系

由分治法产生的子问题往往是原问题的较小模式

在这种情况下,反复应用分治手段,可以使子问题与原问题类型一致而其规模却不断缩小

最终使子问题缩小到很容易直接求出其解

这自然导致递归过程的产生

分治与递归像一对孪生兄弟,经常同时应用在算法设计之中,并由此产生许多高效算法。

递归的2个要素:边界条件、递归方程

递归举例:阶乘、 Fibonacci数列、 Ackerman(双递归函数)、全排列、整数划分

递归的优缺点

优点:

结构清晰,可读性强,而且容易用数学归纳法来证明算法的正确性

因此它为设计算法、调试程序带来很大方便

缺点:

递归算法的运行效率较低,无论是耗费的计算时间还是占用的存储空间都比非递归算法要多

怎样将递归算法转化为非递归算法?

分治法的适用条件

原问题可分割成k个子问题,1<k<=n

这些子问题都可解

可利用这些子问题的解求出原问题的解

问题可以分割为若干个规模较小的(相同)问题

问题的规模缩小到一定的程度就可以容易地解决

利用该问题分解出的子问题的解可以合并为该问题的解;

该问题所分解出的各个子问题是相互独立的,即子问题之间不包含公共的子问题

重复子问题适合什么算法解决?

分治法的复杂性分析

假设

分治法将规模为n的问题分成k个规模为n/m的子问题

分解阀值n0=1

解决规模为1的问题耗费1个单位时间

将原问题分解为k个子问题以及将k个子问题的解合并为原问题的解需用f(n)个单位时间

分治法举例:二分搜索、大整数乘法、Strassen矩阵乘法、棋盘覆盖、归并排序

 

第三章   动态规划

动态规划算法的基本步骤

1.分析最优解的结构

找出最优解的性质,并刻划其结构特征

2.建立递归关系

递归地定义最优值

3.计算最优值

以自底向上的方式计算出最优值

4.构造最优解

根据计算最优值时得到的信息

分析最优解的结构

分析最优解的结构

计算A[i:j]的最优次序所包含的计算矩阵子链 A[i:k]和A[k+1:j]的次序也是最优的

矩阵连乘计算次序问题的最优解包含着其子问题的最优解

这种性质称为最优子结构性质

问题的最优子结构性质是该问题可用动态规划算法求解的显著特征

找出最优解的性质,并刻划其结构特征

建立递归关系

递归地定义最优值

计算最优值

以自底向上的方式计算出最优值

构造最优解

根据计算最优值时得到的信息

动态规划基本要素:最优子结构、重叠子问题

1.最优子结构

原问题的最优解包含着其子问题的最优解

在分析问题的最优子结构性质时,所用的方法具有普遍性

首先假设由原问题的最优解导出的子问题的解不是最优的,然后再设法说明在这个假设下可构造出比原问题最优解更好的解,从而导致矛盾

2.重叠子问题

递归算法求解某些问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次

动态规划算法,每一个子问题只解一次,而后将其解保存在一个表格中

当再次需要解此子问题时,只是简单地用常数时间查看一下结果

示例:矩阵连乘、0-1背包、最长公共子序列、最大子段和

 

第四章   贪心

贪心算法的本质:做出在当前看来最好的选择

贪心算法基本要素:最优子结构性质、贪心选择性质

1.最优子结构性质

当一个问题的最优解包含其子问题的最优解时,称此问题具有最优子结构性质

 

贪心算法和动态规划算法都要求问题具有最优子结构性质,这是2类算法的一个共同点

问题的最优子结构性质是该问题可用动态规划算法或贪心算法求解的关键特征

2.贪心选择性质:

所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到

这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别

对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所做的贪心选择最终导致问题的整体最优解

通常用反证法证明

贪心算法与动态规划算法的另一个区别在于解决问题的方式

动态规划算法通常以自底向上的方式解各子问题

从最小规模问题开始解决问题

贪心算法则通常以自顶向下的方式进行

以迭代的方式做出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题

示例:活动安排、(普通)背包、最优装载、哈夫曼树、单源最短路径

 

第五章   回溯法

具有限界函数

  • 12
    点赞
  • 117
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 计算机算法设计与分析计算机科学与技术专业的一门重要课程,该课程旨在培养学生解决复杂问题的能力,提高算法设计与分析的能力。复习该课程的期末考试,我建议可以从以下几个方面进行复习: 首先,复习算法的基本知识。包括递归与分治策略、动态规划、贪心算法、回溯算法等常见算法的基本原理和代码实现方法。 其次,深入理解常见的时间复杂度和空间复杂度分析方法,熟悉不同算法的优缺点,并能在不同问题场景下选择合适的算法。 然后,重点复习常见的排序算法和查找算法,如冒泡排序、插入排序、选择排序、快速排序、堆排序等,以及线性查找、二分查找等。 另外,复习图算法,包括图的表示方法、图的遍历算法、最短路径算法(Dijkstra算法、Floyd-Warshall算法)和最小生成树算法(Prim算法、Kruskal算法)等。 最后,通过做一些实例题和习题,加深对算法的理解和应用能力,提高解题的效率。 在复习过程中,可以参考csdn等一些相关的学习资源,查找更多的学习资料和参考题目,加深对算法的认识。同时也可以结合自己的课堂笔记、教材和讲义,全面复习和总结。 总之,计算机算法设计与分析期末考试的复习需要全面、系统地复习相关算法和数据结构的知识,并能够熟练应用到实际问题中。通过不断的实践和练习,提高解题的能力和效率。 ### 回答2: 计算机算法设计与分析期末考试复习题介绍了一些重要的算法和数据结构,学生们可以通过复习这些题目来准备考试。以下是一些常见的题型和解答思路: 1. 排序算法:考察对常见排序算法的理解和分析。如快速排序、归并排序、堆排序等。需要掌握它们的时间复杂度、原理和实现方式,以及它们在不同场景下的优劣势。 2. 搜索算法:考察对常见搜索算法的掌握程度。如深度优先搜索(DFS)、广度优先搜索(BFS)、二分查找等。需要了解它们的原理、如何实现以及最优应用场景。 3. 图算法:考察对图算法的熟悉程度。如最短路径算法(如Dijkstra算法、Floyd-Warshall算法)、最小生成树算法(如Prim算法、Kruskal算法)等。需要了解它们的原理、时间复杂度和应用场景。 4. 动态规划:考察对动态规划算法的理解和应用。需要掌握动态规划的基本概念、状态转移方程的建立和求解。重点理解背包问题、最长公共子序列等常见问题的动态规划解法。 5. 数据结构:考察对常见数据结构的掌握程度。如数组、链表、栈、队列、二叉树、图等。需要了解它们的基本操作、特性、应用场景以及在算法中的使用方法。 在复习期间,建议学生们重点关注基础概念的理解、算法原理的掌握以及常见题目的解题技巧。同时,通过做大量的练习题来提升自己的算法设计和分析能力。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值