- 数据结构与算法
- DSA - 首页
- DSA - 概述
- DSA - 环境设置
- DSA - 算法基础
- DSA - 渐近分析
- 数据结构
- DSA - 数据结构基础
- DSA - 数据结构和类型
- DSA - 数组数据结构
- 链表
- DSA - 链表数据结构
- DSA - 双向链表数据结构
- DSA - 循环链表数据结构
- 栈与队列
- DSA - 栈数据结构
- DSA - 表达式解析
- DSA - 队列数据结构
- 搜索算法
- DSA - 搜索算法
- DSA - 线性搜索算法
- DSA - 二分搜索算法
- DSA - 插值搜索
- DSA - 跳跃搜索算法
- DSA - 指数搜索
- DSA - 斐波那契搜索
- DSA - 子列表搜索
- DSA - 哈希表
- 排序算法
- DSA - 排序算法
- DSA - 冒泡排序算法
- DSA - 插入排序算法
- DSA - 选择排序算法
- DSA - 归并排序算法
- DSA - 希尔排序算法
- DSA - 堆排序
- DSA - 桶排序算法
- DSA - 计数排序算法
- DSA - 基数排序算法
- DSA - 快速排序算法
- 图数据结构
- DSA - 图数据结构
- DSA - 深度优先遍历
- DSA - 广度优先遍历
- DSA - 生成树
- 树数据结构
- DSA - 树数据结构
- DSA - 树的遍历
- DSA - 二叉搜索树
- DSA - AVL树
- DSA - 红黑树
- DSA - B树
- DSA - B+树
- DSA - 伸展树
- DSA - Trie树
- DSA - 堆数据结构
- 递归
- DSA - 递归算法
- DSA - 使用递归实现汉诺塔
- DSA - 使用递归实现斐波那契数列
- 分治法
- DSA - 分治法
- DSA - 最大最小问题
- DSA - Strassen矩阵乘法
- DSA - Karatsuba算法
- 贪心算法
- DSA - 贪心算法
- DSA - 旅行商问题(贪心算法)
- DSA - Prim最小生成树
- DSA - Kruskal最小生成树
- DSA - Dijkstra最短路径算法
- DSA - 地图着色算法
- DSA - 分数背包问题
- DSA - 带截止时间的作业排序
- DSA - 最优合并模式算法
- 动态规划
- DSA - 动态规划
- DSA - 矩阵链乘法
- DSA - Floyd-Warshall算法
- DSA - 0-1背包问题
- DSA - 最长公共子序列算法
- DSA - 旅行商问题(动态规划)
- 近似算法
- DSA - 近似算法
- DSA - 顶点覆盖算法
- DSA - 集合覆盖问题
- DSA - 旅行商问题(近似算法)
- 随机化算法
- DSA - 随机化算法
- DSA - 随机化快速排序算法
- DSA - Karger最小割算法
- DSA - Fisher-Yates洗牌算法
- DSA有用资源
- DSA - 问答
- DSA - 快速指南
- DSA - 有用资源
- DSA - 讨论
动态规划
动态规划方法类似于分治法,将问题分解成越来越小的子问题。但与分治法不同的是,这些子问题不是独立解决的。相反,这些较小子问题的结果会被记住并用于类似的或重叠的子问题。
大多数情况下,动态规划算法用于解决优化问题。在解决手头的子问题之前,动态算法会尝试检查先前解决的子问题的结果。子问题的解被组合起来以获得最佳最终解。因此,这种范例被称为自底向上方法。
所以我们可以得出结论:
问题应该能够被分解成更小的重叠子问题。
可以使用较小子问题的最优解来获得最终的最优解。
动态算法使用记忆化。
然而,在一个问题中,两个主要属性可以表明给定的问题可以使用动态规划来解决。它们是:
重叠子问题
与分治法类似,动态规划也组合子问题的解。它主要用于一个子问题的解需要重复使用的地方。计算出的解存储在一个表中,因此不必重新计算。因此,当存在重叠子问题时,需要这种技术。
例如,二分查找没有重叠子问题。而斐波那契数的递归程序有很多重叠子问题。
最优子结构
如果给定问题的最优解可以使用其子问题的最优解获得,则给定问题具有最优子结构属性。
例如,最短路径问题具有以下最优子结构属性:
如果节点x位于从源节点u到目标节点v的最短路径中,则从u到v的最短路径是从u到x的最短路径和从x到v的最短路径的组合。
像Floyd-Warshall和Bellman-Ford这样的标准全对最短路径算法是动态规划的典型例子。
动态规划方法的步骤
动态规划算法的设计遵循以下四个步骤:
描述最优解的结构。
递归地定义最优解的值。
计算最优解的值,通常以自底向上的方式。
根据计算出的信息构造最优解。
动态规划与贪心算法与分治法的比较
与解决局部优化的贪心算法相比,动态算法的目标是对问题进行全局优化。
与分治算法(其中解被组合以获得全局解)相比,动态算法使用较小子问题的输出,然后尝试优化较大的子问题。动态算法使用记忆化来记住已解决子问题的输出。
动态规划的例子
以下计算机问题可以使用动态规划方法解决:
动态规划可以自顶向下和自底向上两种方式使用。当然,大多数情况下,参考之前的解输出比重新计算在CPU周期方面更便宜。