算法
算法
关键对比表
| 算法 | 子问题性质 | 存储中间结果 | 适用问题类型 | 时间复杂度 | 常见例子 |
|---|---|---|---|---|---|
| 分治 | 独立、不重叠 | 通常不需要 | 可分解为独立子问题的问题 | 通常 O(nlogn) | 二分查找【通常 O(nlogn)或O(logn)】 、归并排序 【通常 O(nlogn)】 |
| 回溯 | 尝试所有可能解 | 不需要 | 决策问题(排列、组合) | 指数级(如 O(2n) 或 O(n!)) | n 皇后问题【通常 O(n!)】 、 深度优先 |
| 贪心 | 无子问题依赖 | 不需要 | 具有贪心选择性质的问题 | 通常 O(n) 或 O(nlogn) | |
| 动态规划 | 重叠、有依赖 | 需要(表格) | 最优子结构+重叠子问题 | 多项式级(如 O(n2)) | 两个字符串x(长度m)和y(长度n)的最长公共子串:动态规划【通常 O(mn)】 、 KMP算法【通常 O(m+n)】(KMP算法与动态规划在预处理阶段的思想有部分相似性) |
动态规划:解决具有最优子结构和重叠子问题的问题。
分支限界 :以广度优先方式搜索解空间,适合组合优化问题。
如何选择?
- 分治:子问题独立且合并简单(如排序)。
- 回溯:需要穷举所有可能解(如路径搜索)。
- 贪心:问题具有贪心性质且无需回溯(如最小生成树)。
- 动态规划:子问题重叠且需最优解(如最值问题)。
动态规划 vs 贪心:
- 动态规划会考虑所有可能的选择(保留中间状态),贪心只选当前最优。
- 例如,背包问题中,0-1背包用DP,分数背包用贪心。
动态规划 vs 分治:
- 分治的子问题不重叠(如归并排序),DP的子问题重叠(如斐波那契数列)。
浙公网安备 33010602011771号