算法

算法

关键对比表

算法 子问题性质 存储中间结果 适用问题类型 时间复杂度 常见例子
分治 独立、不重叠 通常不需要 可分解为独立子问题的问题 通常 O(nlog⁡n) 二分查找【通常 O(nlog⁡n)或O(log⁡n)】 、归并排序 【通常 O(nlog⁡n)】
回溯 尝试所有可能解 不需要 决策问题(排列、组合) 指数级(如 O(2n) 或 O(n!)) n 皇后问题【通常 O(n!)】 、 深度优先
贪心 无子问题依赖 不需要 具有贪心选择性质的问题 通常 O(n) 或 O(nlog⁡n)
动态规划 重叠、有依赖 需要(表格) 最优子结构+重叠子问题 多项式级(如 O(n2)) 两个字符串x(长度m)和y(长度n)的最长公共子串:动态规划【通常 O(mn)】KMP算法【通常 O(m+n)】(KMP算法与动态规划在预处理阶段的思想有部分相似性)

动态规划:解决具有最优子结构和重叠子问题的问题。

分支限界 :以广度优先方式搜索解空间,适合组合优化问题。


如何选择?

  1. 分治:子问题独立且合并简单(如排序)。
  2. 回溯:需要穷举所有可能解(如路径搜索)。
  3. 贪心:问题具有贪心性质且无需回溯(如最小生成树)。
  4. 动态规划:子问题重叠且需最优解(如最值问题)。

动态规划 vs 贪心

  • 动态规划会考虑所有可能的选择(保留中间状态),贪心只选当前最优。
  • 例如,背包问题中,0-1背包用DP,分数背包用贪心。

动态规划 vs 分治

  • 分治的子问题不重叠(如归并排序),DP的子问题重叠(如斐波那契数列)。
posted @ 2025-05-07 17:23  deyang  阅读(25)  评论(0)    收藏  举报