常见算法思想
简介
几种常见的算法思想, 用来指导我们设计具体的算法和编码, 有
贪心算法, 分治算法, 回溯算法, 动态规划
贪心算法(greedy algorithm)
经典应用, 霍夫曼编码, Prim和Kruskal最小生成树算法, Dijkstra单源最短路径算法
经典问题, 背包问题, 固定容量下, 让背包里装的物品总价值最大, 贪心算法用法则是计算物品单价, 单价从高到低依次放入包中
使用贪心算法解决问题的步骤
- 第一步, 看到这类问题, 首先联想到贪心算法
- 尝试看下这个问题是否能用贪心算法解决
- 举例看下贪心算法产生的结果是否是最优解
大部分能用贪心算法的问题, 结果都是正确的, 但也有解决不掉的问题, 比如前面的选择会影响后面的选择, 局部最优未必全局最优
类似能用贪心算法解决的问题, 分糖果, 钱币找零, 区间覆盖等
贪心算法最难的是如何将要解决的问题抽象成贪心算法模型, 后续的编码一般都很简单
贪心算法解决问题的正确性虽然很多时候都很高, 但要严谨的证明算法能得到最优解, 并不容易
分治算法
分治算法核心思想就是四个字, 分而治之, 将原问题划分为n个规模较小, 并且结构与原问题相似的子问题, 递归的解决这些子问题, 然后再合并其结果, 就得到原问题的解
有点类似递归, 分治算法是一种处理问题的思想, 递归是一种编程技巧, 分治算法一般都比较适合用递归来实现
分治算法能解决的问题, 一般需要满足下面几个条件
- 原问题与分解成的小问题具有相同的模式
- 原问题分解成的子问题可以独立求解, 子问题之前没有相关性(和动态规划的明显区别)
- 具有分解终止条件, 当问题足够小时, 可以直接求解
- 可以将子问题合并成原问题, 且合并操作复杂度不太高, 否则

最低0.47元/天 解锁文章
794

被折叠的 条评论
为什么被折叠?



