算法的好坏标准
- 正确性:满足问题的需求,运行正常,无语法错误,
通过软件测试。 - 易读性:简洁易懂,注释语句恰当适量。
- 健壮性:算法对非法数据及操作有较好的反应和处理。
- 高效性:算法运行效率高,即算法运行所消耗的时间短。
- 低存储性:低存储性是指算法所需要的存储空间低。
- 六字总结:高效率 低存储
第二章 贪心算法
一个贪心算法总是做出当前最好的选择,也就是说,它期望通过局部最优选择
从而得到全局最优的解决方案。
—《算法导论》
- 贪心算法求解两个重要的特性
(1)贪心选择 每一步都作出当前的最佳(何为最佳,策略不同,情况不同)选择 仅依赖于之前作出的选择
(2)最优子结构 问题的最优解包含其子问题的最优解
- 贪心算法秘籍
(1)贪心策略 选择当前看上去最好的一个方案 如最大的 最值钱的 最重的
(2)局部最优解 根据贪心策略,一步一步地得到局部最优解
(3)全局最优解 所有的局部最优解合成为原来问题的一个最优解
- 如何定义最优子结构
分解问题模型 缩小问题的规模
最优解子问题的分解结构和堆叠方式
分解结构:每一步都在前一步的基础上选择当前最好的解(钱币找零问题)
堆叠结构:分解成相对独立的几个子问题,最后进行合并(某种公式计算法则)
- 贪心算法的缺陷
贪婪法每一步选择完之后,局部最优解就确定
不再进行回溯,之前选择不再修改,直到算法结束
贪心只有极少情况可以得到最优解
通常得到的是近似最优解,但是简单高效
省去了为找最优解可能需要的穷举操作
- 贪心算法的典型应用
最优装载问题 背包问题 会议安排问题
第三章 分治法
- 分治,顾名思义,分而治之。
大问题分解成一系列规模较小的相同问题,然后逐个解决小问题,即所谓的分而治之。分治法产生的子问题与原始问题相同,只是规模减小。
- 分治法求解的三个条件
(1)原问题可分解为若干个规模较小的相同子问题。 分治
(2)子问题相互独立。单个问题的解不会影响到下个问题。
(3)子问题的解可以合并为原问题的解。 归并- 分治算法秘籍
(1)分解:将要解决的问题分解为若干个规模较小、相互独立、与原问题形式相同的子问题,确保各个子问题的解具有相同的子结构
(2)治理:求解各个子问题。由于各个子问题与原问题形式相同,只是规模较小而,
而当子问题划分得足够小时,就可以用较简单的方法解决。 问题可以解决,直接解决,否则继续用相同的规则接着分解。
(3)合并:按原问题的要求,将子问题的解逐层合并构成原问题的解。
分治法的实现模式可以是递归方式,也可以是非递归方式,应用分治法的目的
(1)通过分解问题,使无法着手解决的大问题变成容易解决的小问题
(2)通过减小问题的规模,降低解决问题的复杂度(或计算量)
- 递归和分治联系
问题的分解肯定不是一步到位的,反复调用,层层分解,自然导致了递归的调用。
分治法得到的子问题和原问题是相同的,当然可以用相同的函数来解决
区别只在于问题的规模和范围不同,可以通过参数来控制范围
递归同时也可以该用循环的方式,特别是尾递归(此部分后续会有单独的分析)分治算法的典型应用
二分搜索技术 合并排序 快速排序第四章 动态规划
动态规划解决复杂问题的思路也是对问题进行分解,通过求解小规模的子问题再反推出原问题的结果。动态规划也是把原问题分解为若干子问题,然后自底向上,先求解最小的子问题,把结果存储在表格中,再求解大的子问题时, 直接从表格中查询小的子问题的解, 避免重复计算, 从而提高算法效率。
- 动态规划求解两个特性
(1)最优子结构 问题的最优解包含其子问题的最优解
(2)子问题重叠 有大量的子问题是重复的,记录结果,避免重复运算
(3)无后向性 决策仅受之前决策的影响,不影响之后各阶段的决策
- 动态规划秘籍
(1)分析最优解的结构特征。
(2)建立最优值的递归式。(也可以称为决策策略)
(3)自底向上计算最优值,并记录。
(4)构造最优解。
- 如何建立最优值的递推式
(1)定义最优子问题 确定问题的优化目标
(2)定义状态 决策的结果(状态) 最终的结果(状态)就是最终解
(3)定义决策和状态转换方程 状态递增的表达式(不一定是数学表达式)
(4)确定边界条件 实际上就是递归终结条件,无需额外的计算分析原问题最优解和子问题最优解的关系。考查有多少种选择。得到最优解递归式。 以上的理解请不要陷入细节,更多的理解请从实际的案例中体会。问题的重复求解是动态规划提升的关键。
动态规划的典型应用
青蛙上台阶问题
棋盘格跳马问题最长公共子序列 最大的子数组之和 编辑距离 游艇租赁 矩阵连乘 0-1背包问题
第五章 回溯法
回溯法是一种选优搜索法,按照选优条件深度优先搜索,以达到目标。当搜索到某一步
时,发现原先选择并不是最优或达不到目标,就退回一步重新选择,这种走不通就退回再走
的技术称为回溯法
回溯法是一种“ 能进则进,进不了则换,换不了则退”的搜索方法。
- 回溯法的算法要素
首先要确定解的形式,定义问题的解空间
解空间:顾名思义,就是由所有可能解组成的空间。解空间越小,搜索效率越高。
一个问题的解空间通常由很多可能解组成,一定的组织结构搜索最优解,
如果把这种组织结构用树形象地表达出来,就是解空间树。![]()
隐约束指对能否得到问题的可行解或最优解做出的约束。如果不满足隐约束,
就说明得不到问题的可行解或最优解,那就没必要再沿着该结点的分支进行搜索了,
相当于把这个分支剪掉了
显约束可以控制解空间大小,隐约束是在搜索解空间过程中判定可行解或最优解的。
- 回溯法解题秘籍
(1)定义解空间 确定解空间包括解的组织形式和显约束(范围限定)
(2)确定解空间的组织结构 通常用解空间树形象的表达(只是辅助理解并不是真的树)
(3)搜索解空间 按照深度优先搜索,根据限制条件,搜索问题的解- 回溯法的典型应用
0-1背包问题 最大团(护卫队) n皇后问题 地图m着色问题 最优加工顺序问题