基础算法策略总结-分而治之,动态规划,贪心策略; 回溯法和分支定界;

最近在刷算法题目,突然重新思考一下大二时学习的算法分析与设计课程,发现当时没有学习明白,只是记住了几个特定的几个题型;现在重新回归的时候,上升到了方法学上了;感觉到了温故知新的感觉;以下总结自童咏昕老师的算法设计与分析课程和韩军老师的算法分析与设计课程;当我们遇到一个问题的时候,我们先想出一个简单的方法,可以之后再在这个方法的基础上进行优化;

分而治之思路:(存在独立子问题,三个步骤都很重要)

  1. 分解原问题;(存在子问题,可以递归求解,子问题不重叠,子问题比原问题规模小)
  2. 解决子问题;
  3. 合并问题解;
  4. 经典问题:
    • 归并排序,最大子数组问题;逆序计数问题;(简化了分解的过程,聚焦于合并求解过程
    • 快速排序,次序选择问题;(聚焦于分解问题过程,简化了合并问题解)

动态规划思路:(存在重叠子问题)

  1. 问题结构分析;(存在子问题,可以递归求解,子问题重叠,带有memo的递归求解,动态规划自底向上)
  2. 递推关系建立;
  3. 自底向上计算;(可以先用小规模数据找到求解规律,编程)
  4. 最优方案追踪;(根据求解的顺序,判断当前问题规模的解,来自于那个子问题)
  5. 经典问题:
    • 0-1背包问题(物品不可分割);最大子数组问题;最长公共子序列问题;最长公共子串问题;最小编辑距离问题;(有限的情况的选择
    • 钢条切割问题;矩阵链乘法问题;(区间型的动态规划,需要枚举一个区间)

贪心策略思路:(存在单一子问题,需要证明贪心策略正确性)

  1. 贪心算法是指,在求解问题时,总是做出在当前最好的选择,不从整体最优上考虑。选择当前局部最优解;贪心算法不是对所有问题都能得到整体最优解,关键是贪心策略的选择;选择贪心策略必须具备无后效性,即某个状态以前的过程不会影响以后的状态,只与当前状态有关。
  2. 提出贪心策略;
  3. 证明贪心策略正确;(数学归纳法或反证法)
  4. 经典问题:
    • 部分背包问题(物品可分割,可以按照价值和重量比来进行排序);
    • 霍夫曼编码问题;活动选择问题;

求解思路:

经典问题:

回溯法:一种优先搜索法,试探法;总体思想就是,在搜索空间树中,按照选择条件向前搜索(深度优先搜索),以达到目标(找到解空间树中满足约束条件的所有解);当搜索到某一步时,发现搜索选择并不优或达不到目标,就回退一步,重新选择(常常使用递归实现);递归实现有三个核心要点:递归出口,函数参数,处理过程。回溯法在求解0/1背包问题的时候,虽然回溯过程中的剪枝,减少了搜索空间;但是整个搜索按深度优先机械进行,是盲目搜索(不可预测本节点以下的节点如何进行);

分支限界法:即在搜索空间树中进行搜索(广度优先,最小耗费优先,最大效益优先方式搜索),以达到求解目标(在满足约束条件的解中,找出在某种意义下的最优解或者找出满足约束条件的解,剪枝的原因)。分支限界算法,首先是确定一个合理的限界函数,然后根据函数确定目标函数的上下界(该届在最优解情况下可更新);然后按照广度优先的策略遍历问题的解空间树,在某一分支上,依次搜索该结点的所有孩子结点,分别估算这些孩子结点的目标函数的可能取值(对于最小化问题估算结点的下界,对于最大化问题,估算该结点的上界);如果某个孩子结点的目标函数值超出了目标函数的界,则将其丢弃(限界),否则加入队列中;

其他算法思想:近似算法,随机算法和启发式算法;

保持更新,转载请注明出处;更多内容请关注cnblogs.com/xuyaowen;

回溯法参考链接:https://zhuanlan.zhihu.com/p/51882471 

猜你喜欢

转载自blog.csdn.net/qq_45533937/article/details/113000700