25-5-23算法课学习文件2
本文最后由方少年更新于2025 年 11 月 10 日,已超过20天没有更新。如果文章内容或图片资源失效,请留言反馈,将会及时处理,谢谢!
当然可以!你已经阅读并提到了两份重要讲义:
- ✅ **Week 10 - Greedy.pdf**
- ✅ **Week 11 - Divide and Conquer.pdf**
你之前问过的内容(如 `T(n) = 4T(n/2) + O(n²)` 等复杂度分析)确实**都出现在这两份讲义中**,而且你目前的理解已经非常接近完全掌握了 🎯
------
## ✅ 我现在为你**总结和再讲一遍**讲义中关于:
### 1. 贪心算法(Greedy)
### 2. 分治算法(Divide and Conquer)
### 3. 递推式复杂度分析(Recurrence Analysis)
------
## 🧠 第一部分:贪心算法(Week 10)
### ✅ 定义:
贪心算法通过**每一步做出当前最优选择(局部最优)**,希望得到最终的整体最优解(全局最优)。
------
### ✅ 示例 1:Fractional Knapsack Problem
> 给定每个物品的 benefit $b_i$ 和 weight $w_i$,目标是选取总重量至多为 W 的物品,使总 benefit 最大。
------
### 🎯 正确贪心策略:
选择 **性价比最高**(即 $b_i / w_i$ 最大)的物品,尽量装满背包。
```python
# 正确策略是按 b[i]/w[i] 从大到小排序
for i in sorted_by_ratio:
x[i] = min(w[i], W - curr)
```
------
### ❌ 错误策略示例(讲义中有反例):
- 按最大 benefit 排序 ❌
- 按最小 weight 排序 ❌
这些贪心策略可能导致非最优解。
------
### ✅ 正确性证明(略讲):
使用 **交换论证(exchange argument)**,证明如果有比 greedy 更好的解,可以交换其中一部分,让其变得更好 —— 导致矛盾,说明 greedy 是最优。
------
### ✅ 时间复杂度:
- 排序:O(n log n)
- 按顺序取物品:O(n)
- 总复杂度:**O(n log n)**
------
## 🧠 第二部分:分治算法(Week 11)
### ✅ 分治三步法:
> Divide and Conquer = 分 + 治 + 合
1. **Divide**:将问题划分为子问题
2. **Conquer (Recur)**:递归解决子问题
3. **Combine**:合并子问题答案得到最终结果
------
### ✅ 示例:Merge Sort
```text
T(n) = 2T(n/2) + O(n)
→ 合并两个有序数组需要 O(n)
→ 递归两个子数组
→ 总复杂度为 O(n log n)
```
------
### ✅ Master Theorem 主定理(讲义第90页之后)
用于求解形如:
$T(n) = aT(n/b) + f(n)$
的递推式。
------
#### 三种情况总结:
| 情况 | 比较关系 | 结果 |
| ------ | ------------------------------------------------------------ | -------------------------------------- |
| Case 1 | $f(n) = O(n^{\log_b a - \varepsilon})$ | $T(n) = \Theta(n^{\log_b a})$ |
| Case 2 | $f(n) = \Theta(n^{\log_b a})$ | $T(n) = \Theta(n^{\log_b a} \log n)$ ✅ |
| Case 3 | $f(n) = \Omega(n^{\log_b a + \varepsilon})$ 且满足 regularity | $T(n) = \Theta(f(n))$ ✅ |
------
### ✅ 你问过的例子(都在讲义中出现了!)
------
#### 例子 1:
$T(n) = 4T(n/2) + O(n^2)$
- $a = 4$, $b = 2$, $\log_b a = 2$
- $f(n) = \Theta(n^2)$
- ⇒
Case 2
⇒
$\boxed{T(n) = \Theta(n^2 \log n)}$
------
#### 例子 2:
$T(n) = 4T(n/2) + O(n^3)$
- $f(n) = \Omega(n^{2 + 1}) = \Omega(n^3)$
- 满足 regularity(见讲义第81页)
- ⇒ **Case 3**
- ⇒
$\boxed{T(n) = \Theta(n^3)}$
------
#### 例子 3:
$T(n) = 2T(n/2) + O(n)$
- Merge Sort 的复杂度
- ⇒
$\boxed{T(n) = \Theta(n \log n)}$
------
## 🧠 第三部分:递归树法(Recursion Tree)
讲义中也有(见第49–51页),你可以通过“每层的工作量 + 层数”方式理解。
比如:
$T(n) = 2T(n/2) + O(n)$
- 每层工作量 O(n)
- 总共 log n 层
- ⇒ O(n log n)
------
## ✅ 总结表格:你问过的复杂度分析一览
| 递推式 | 分析方法 | 复杂度 |
| ---------------------- | --------------------- | ----------- |
| T(n) = 2T(n/2) | Master Theorem Case 1 | Θ(n) |
| T(n) = 2T(n/2) + O(n) | Merge Sort, Case 2 | Θ(n log n) |
| T(n) = 4T(n/2) + O(n²) | Case 2 | Θ(n² log n) |
| T(n) = 4T(n/2) + O(n³) | Case 3 | Θ(n³) |
| T(n) = 4T(n/2) + O(n⁴) | Case 3 | Θ(n⁴) |
------
如果你想,我可以帮你画出这些递归树图,或者做成交互式动画演示这些复杂度是如何形成的!是否需要我为你做一个?😊
文章标题:25-5-23算法课学习文件2
文章链接:https://www.fangshaonian.cn/archives/87/
最后编辑:2025 年 11 月 10 日 18:31 By 方少年
许可协议: 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)