最经典的算法思想有以下几种:
- 贪心算法:每一步都采用最优的选择,从而希望结果是最好的
- 分治算法:将原问题拆分成多个结果类似的子问题,递归解决后再合并其结果
- 回溯算法:类似于试探性枚举搜索,用于指导深度优先搜索这样的经典算法
- 动态规划:优化自顶向下的重复子问题,自底向上地推算出问题的最优解
贪心算法
理论
贪心算法是一种在每一步选择当中都采取当前状态下最好或最优(即最有利)的选择,从而希望导致结果是最好或最优的算法。
贪心算法在有最优子结构的问题中尤为有效,简单地说,就是问题能够分解成子问题来解决,子问题的最优解就能递推到最终问题的最优解。
细节
- 创建数学模型来描述问题;
- 把问题分成若干个子问题;
- 对每一子问题求解,得到子问题的局部最优解;
- 把子问题的局部最优解合并成原来问题的一个解。
案例
对于零钱的问题:假设有 25 分、10 分、5 分、1 分这 4 种硬币,现在要从中取出 41 分钱的硬币,并且要求硬币的个数最少。
通过贪心算法,我们每次都拿出最大额度的硬币,直到此额度超过了所需的额度。详细的过程如下:
- 对于 41 分钱,拿出 25 分的硬币,此时还差 16 分钱,25 分的硬币超过了所需的额度,自然需要往更优、更小的额度去取;
- 对于 16 分钱,拿出 10 分的硬币,此时还差 6 分钱,10 分的硬币超过了所需的额度,自然需要往更优、