以下是我的部分算法笔记,希望可以给复习的小伙伴们参考一下:
题目:
-
一切合法的输入数据都能得出满足要求的结果,包括典型的、苛刻的输入数据也能够得出满足要求的结果。这个含义对应算法的(正确性)
-
算法要对异常情况进行适当的处理,就是算法的(健壮性)
-
算法操作的对象是数据,数据间的()就是数据的数据结构
逻辑关系,存储关系,处理关系
4.算法设计应满足以的目标包括()
正确性,可使用性,健壮性
正确性:算法能够按照规定的功能和性能正确地执行,这是最基本并且最重要的标准!
可使用性:也叫用户友好性,算法能够方便地使用
可读性:算法是易于理解的,这要求算法在逻辑上是清晰的、结构化的
健壮性:算法具有容错性,即异常处理,能够检测不合理的数据,保证程序不发生异常中断等
高效率低存储:效率是指算法的执行时间;存储是指算法执行所用的最大存储空间。算法应该在保证前面的条件下,执行时间尽可能低存储空间尽可能小
递归的概念
执行过程分为递推和回归两个阶段
直接或间接地调用自身的算法称为递归算法。用函数自身给出定义的函数称为递归函数。
边界条件与递归方程是递归函数的两个要素
全排列问题:n!
分治法的基本思想
分而治之
分治法的基本思想是将一个规模为n的问题分解为k个规模较小的子问题,这些子问题互相独立且与原问题相同。递归地解这些子问题,然后将各子问题的解合并得到原问题的解,自底向上。
-
所能解决的问题一般具有以下几个特征:
1.该问题的规模缩小到一定程度就可以容易地解决。
2.具有最优子结构性质
3.利用问题分解出的子问题的解可以合并为原问题的解
4.分解出的各个子问题是相互独立的
若只有前两条,则可以考虑贪心算法或动态规划
-
主定理:
-
排序方法: 平均时间 最坏情况
简单排序 O(n^2) O(n^2)
快速排序 O(nlogn) O(n^2)
堆排序 O(nlogn) O(nlogn)
合并排序 O(nlogn) O(nlogn)
-
二分查找:最坏情况O(logn)
-
最大整数的乘法:传统:O(n^2)
动态规划算法
-
动态规划算法的两个基本要素是最优子结构和 重叠子问题 。
问题的最优解包含着其子问题的最优解, 称为最优子结构性质。
递归算法求解问题时,每次产生的子问题并不总是新问题,有些子问题被反复计算多次。这种性质称为子问题的重叠性质。
动态规划算法适用于解最优化问题,通常可按以下 4 个步骤设计: ① 找出最优解的性质,并刻画其结构特征; ② 递归地定义最优值; ③ 以自底向上的方式计算最优值; ④根据计算最优值时得到的信息,构造最优解。
-
动态规划算法与分治法的区别:
动态规划算法与分治法类似,其基本思想是将待求解问题分解成若干子问题,先求解子问题,再结合这些子问题的解得到原问题的解。与分治法不同的是,适合用动态规划法求解的问题经分解得到的子问题往往不是互相独立的。若用分治法来解这类问题,则分解得到的子问题数目太多,以致最后解决原问题需要耗费指数级时间。
1)问题的规模缩小到一定的程度就可以容易地解决。
2)问题可以分解为若干个规模较小的相似问题,即该问题具有最优子结构性质。
3)利用该问题分解出的子问题的解可以合并为该问题的解。
4)该问题所分解出的各个子问题是相互独立的且子问题之间不包含公共的子问题。
当问题满足1,2,3,4条时采用分治法,当满足1、2、3条时采用动态规划方法
-
矩阵连乘:最优子结构,在计算过程中,保存已解决的子问题答案。每个子问题只计算一次(时间O(n ^3),空间O(n ^2))
-
最长公共子序列:最优子结构性质,重叠子问题(时间O(mn))
-
0-1背包:最优子结构
贪心算法
贪心算法总是做出在当前看来是最好的选择。也就是说,贪心算法并不从整体最优上加以考虑,所做的选择只是在某种意义上的局部最优选择。当然,我们希望贪心算法得到的最终结果也是整体最优的。在一些情况下,即使贪心算法不能得到整体最优解,其最终结果却是最优解的很好近似解。
许多可以用贪心算法求解的问题一般具有2个重要的性质 贪心选择性质和最优子结构性质。
a) 所谓贪心选择性质是指(所求问题的整体最优解可以通过一系列局部最优的选择,即贪心选择来达到)。
b) 所谓最优子结构性质是指(问题的最优解包含了其子问题的最优解)。
●动态规划和贪心算法的区别: 动态规划和贪心算法都是一种递推算法 ,均有局部最优解来推导全局最优解 。
不同点: 贪心算法: 1.贪心算法中,作出的每步贪心决策都无法改变,因为贪心策略是由上一步的最优解推导下一步的最优解,而上一部之前的最优解则不作保留。 2.由(1)中的介绍,可以知道贪心法正确的条件是:每一步的最优解一定包含上一步的最优解。
动态规划算法: 1.全局最优解中一定包含某个局部最优解,但不一定包含前一个局部最优解,因此需要记录之前的所有最优解 2.动态规划的关键是状态转移方程,即如何由以求出的局部最优解来推导全局最优解 3.边界条件:即最简单的,可以直接得出的局部最优解
回溯法(深度优先搜索DFS)
回溯法是在包含问题的所有解的解空间树中,按照深度优先的策略,从根结点出发搜索解空间树,当算法搜索至解空间树的任一结点时,总是先判断该结点是否满足问题的约束条件。如果满足进入该子树,继续按深度优先的策略进行搜索。否则,不去搜索以该结点为根的子树,而是逐层向其祖先结点回溯。
用回溯法解问题时,应明确定义问题的解空间,问题的解空间至少应包含一个(最优)解
基本步骤:
① 针对拨给问题,定义问题的解空间;
② 确定易于搜索的解空间结构;
② 以深度优先方式搜索解空间,并在搜索过程中用剪枝函数避免无效搜索。
③ 回溯法是回溯法是指(具有限界函数的深度优先生成法)。
-
用回溯法解题的一个显著特征是在搜索过程中动态产生问题的解空间。在任何时刻,算法只保存从根结点到当前扩展结点的路径,由x[1:t]保存该路径上边的取值 。
0-1背包 :子集树 时间o(2^n) 空间o(n)
旅行售货员 :排列树 时间o(n!) 空间o(n)
批处理作业调度:排列数
-
回溯法的算法框架按照问题的解空间一般分为(子集树)算法框架与(排列树)算法框架。
用回溯法解0/1背包问题时,该问题的解空间结构为(子集树)结构。
用回溯法解批处理作业调度问题时,该问题的解空间结构为(排列树)结构。
分支限界法(广度优先搜索BFS)
分支限界法类似回溯法,也是在问题的解空问上搜索问题解的算法。一般情况下,分支限界法与回溯法的求解目标不同。回溯法的求解目标是找出解空间中满足约束条件的所有解,而分支限界法的求解目标是找出满足约束条件的一个解,或是在满足约束条件的解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
回溯法与分支限界法的区别
两者都是问题的解空间树上搜索问题解的算法。回溯法与分支限界法的的求解目标不同,回溯法的求解目标是找出解空间树中满足约束条件的所有解,而分支限界法的求解目标是找出解空间树中满足约束条件的一个解,或是在满足约束条件的
解中找出使某一目标函数值达到极大或极小的解,即在某种意义下的最优解。
[ 二分搜索 ]
排好序数组,x跟中间的对比,再依次重复以上步骤
[ 合并排序 ]
思想:将两个有序的数组合成一个有序的数组解决问题。逐个比较a1和a2中元素大小,依次取小的存入a3文章来源:https://www.toymoban.com/news/detail-537668.html
[ 快速排序 ]
将数组第一个设为基准值,i在最左边,j在最右边,两个都往中间靠。当i碰到比基准数大的数和j碰到比基准数小的数时,就将两个数交换;当i,j汇合时,此时的数和基准值交换。此时,将左边和右边分别拉出来再次快排。每次都需要j先移动,因为当最后i和j相碰时,此时所指向的是j寻找到比基准值小的数字,然后和基准值交换能确保基准值左边的都是小于基准值的数字,但是如果i先右边移动的话,最后i和j相碰时,i和j所指向的是i寻找得比基准值大的数,此时和基准值相交换,基准值左边是有一个比基准值大的数,没有达到我们需要的排序效果。文章来源地址https://www.toymoban.com/news/detail-537668.html
到了这里,关于计算机算法设计与分析期末复习的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!