From 5f2154b49d9fd13b9a465a40a80a3cadfcb3c4b1 Mon Sep 17 00:00:00 2001 From: krahets Date: Fri, 21 Jul 2023 22:50:29 +0800 Subject: [PATCH] build --- chapter_greedy/greedy_algorithm.md | 4 +--- chapter_greedy/index.md | 1 + chapter_greedy/summary.md | 17 +++++++++++++++++ 3 files changed, 19 insertions(+), 3 deletions(-) diff --git a/chapter_greedy/greedy_algorithm.md b/chapter_greedy/greedy_algorithm.md index 5a05c95d2..8d01193e2 100644 --- a/chapter_greedy/greedy_algorithm.md +++ b/chapter_greedy/greedy_algorithm.md @@ -18,8 +18,6 @@ status: new 给定 $n$ 种硬币,第 $i$ 个硬币的面值为 $coins[i - 1]$ ,目标金额为 $amt$ ,每种硬币可以重复选取,问能够凑出目标金额的最少硬币个数。如果无法凑出目标金额则返回 $-1$ 。 -贪心算法会迭代地做出一个又一个的贪心选择,每轮都将问题转化成一个规模更小的子问题,直到问题被解决。 - 这道题的贪心策略在生活中很常见:给定目标金额,**我们贪心地选择不大于且最接近它的硬币**,不断循环该步骤,直至凑出目标金额为止。 ![零钱兑换的贪心策略](greedy_algorithm.assets/coin_change_greedy_strategy.png) @@ -167,7 +165,7 @@ status: new 那么问题来了,什么样的问题适合用贪心算法求解呢?或者说,贪心算法在什么情况下可以保证找到最优解? -相较于动态规划,贪心算法的使用条件更加苛刻,其主要关心问题的两个性质: +相较于动态规划,贪心算法的使用条件更加苛刻,其主要关注问题的两个性质: - **贪心选择性质**:只有当局部最优选择始终可以导致全局最优解时,贪心算法才能保证得到最优解。 - **最优子结构**:原问题的最优解包含子问题的最优解。值得注意的是,一些问题的最优子结构并不明显,但仍然可使用贪心算法解决。 diff --git a/chapter_greedy/index.md b/chapter_greedy/index.md index ecab57d64..d226852b6 100644 --- a/chapter_greedy/index.md +++ b/chapter_greedy/index.md @@ -18,3 +18,4 @@ status: new - [15.2   分数背包问题](https://www.hello-algo.com/chapter_greedy/fractional_knapsack_problem/) - [15.3   最大容量问题](https://www.hello-algo.com/chapter_greedy/max_capacity_problem/) - [15.4   最大切分乘积问题](https://www.hello-algo.com/chapter_greedy/max_product_cutting_problem/) +- [15.5   小结](https://www.hello-algo.com/chapter_greedy/summary/) diff --git a/chapter_greedy/summary.md b/chapter_greedy/summary.md index e69de29bb..0c5cf0c1d 100644 --- a/chapter_greedy/summary.md +++ b/chapter_greedy/summary.md @@ -0,0 +1,17 @@ +--- +comments: true +status: new +--- + +# 15.5.   小结 + +- 贪心算法通常用于解决最优化问题,其原理是在每个决策阶段都做出局部最优的决策,以期望获得全局最优解。 +- 贪心算法会迭代地做出一个又一个的贪心选择,每轮都将问题转化成一个规模更小的子问题,直到问题被解决。 +- 贪心算法不仅实现简单,还具有很高的解题效率。相比于动态规划,贪心算法的时间复杂度通常低一个数量级。 +- 在零钱兑换问题中,对于某些硬币组合,贪心算法可以保证找到最优解;对于另外一些硬币组合则不然,贪心算法可能找到很差的解。 +- 贪心问题具有两大性质:贪心选择性质和最优子结构。贪心选择性质代表贪心策略的有效性。 +- 对于某些复杂问题,贪心选择性质的证明并不简单。相对来说,证伪更加容易,例如零钱兑换问题。 +- 求解贪心问题主要分为三步:问题分析、贪心策略确定、正确性证明。其中,贪心策略确定是核心步骤,而正确性证明是难点。 +- 分数背包问题在 0-1 背包的基础上,允许选择物品的一部分,因此可使用贪心算法求解。可以采用反证法证明贪心策略的正确性。 +- 最大容量问题可使用穷举法求解,时间复杂度为 $O(n^2)$ 。通过设计贪心策略,每轮向内移动短板,可将时间复杂度优化至 $O(n)$ 。 +- 在最大切分乘积问题中,我们先后推理出两个贪心策略:$\geq 4$ 的整数都应该继续切分、最优切分因子为 $3$ ,从而得到贪心解法。代码中包含幂运算,时间复杂度取决于幂运算实现方法,通常为 $O(1)$ 或 $O(\log n)$ 。