计算机算法 ------任课教师:于文,信院小仙女,嘻嘻(如有侵权,请联系我)
主要知识点及练习 ------自己整理的,从老师的PPT上
第一章 概述
算法的基本概念
算法是指解决问题的一种方法或一个过程
算法是若干指令的有穷序列,满足性质:
- 输入:有0个或多个由外部提供的量作为算法的输入
- 输出:算法产生至少一个量作为输出
- 确定性:组成算法的每条指令是清晰,无歧义的
- 有限性:算法中每条指令的执行次数是有限的,执行每条指令的时间也是有限的
语句的频度和算法的时间复杂度
对算法时间的度量用其基本操作重复执行的次数来近似,称为时间复杂度,记作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.贪心选择性质:
所谓贪心选择性质是指所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到
这是贪心算法可行的第一个基本要素,也是贪心算法与动态规划算法的主要区别
对于一个具体问题,要确定它是否具有贪心选择性质,必须证明每一步所做的贪心选择最终导致问题的整体最优解
通常用反证法证明
贪心算法与动态规划算法的另一个区别在于解决问题的方式
动态规划算法通常以自底向上的方式解各子问题
从最小规模问题开始解决问题
贪心算法则通常以自顶向下的方式进行
以迭代的方式做出相继的贪心选择,每做一次贪心选择就将所求问题简化为规模更小的子问题
示例:活动安排、(普通)背包、最优装载、哈夫曼树、单源最短路径
第五章 回溯法
具有限界函数