动态规划时间复杂度_算法分析与设计之动态规划

f6453ffd709a6d2650f296e1df107595.png

动态规划同样是一种将问题分解为求解子问题的方法,不过与分治不同的是,动态规划算法的子问题不是相互独立的,而是有公共的部分,即有重叠子问题,这个时候使用分治算法,将会重复计算公共的子问题,效率很低!而用某种方法将中间计算的结果保存下来,以供后面直接使用,将会大大提高效率,体现了一种“用空间换时间的”思想!

90e1c014301829deae17c116e1f09cc6.png

那么什么样的问题才可以使用动态规划方法呢?有两个条件:

726addd07e2950a7d0b7cc37055b2342.png

动态规划算法的设计步骤:

87caeab40a6236e361652e0ea43f2f61.png

接下来,将通过几个例子来体会动态规划的基本思想。

例1: 最长公共子序列问题

c6d9985dfdd97f2b4bdf490db7d5715c.png

思考,该问题的优化子结构是:

8eb61f93a370e80b34b068744234aae4.png

证明如下:

ac21d528e2eaf20235756a526b14960a.png

ea6f8954d1631f86a3e5c3dc24c67df8.png

递归的定义最优解的代价:

f3b436a25c73ed17deaaa8d2ca76c681.png

重叠子问题:

74aad985581c4a58e60abfb45c0f0503.png

建立递归方程:

6734441ae067c901c6e43eb572fb7505.png

则从左往右、从上往下进行计算:

a3d1970112a17850ee99f4cde2e548e6.png

写出算法的伪代码如下:

537a54e584c153a6aab40c2fd5f618d1.png

构造最优解:

7b27fa265f72a9dc256e4a3b4a86a67d.png

cabfd4812f9bf1d67386d6635dacfd66.png

例2: 矩阵链乘法

d832749fbd4211c2b60fe574754f1e0a.png

注意到,矩阵链乘法的代价对于不同的计算顺序,代价也不同。

86585728fffedc73b2e543e27d7754cc.png

优化子结构:

ae1fa79a77fa273e75de8cf30c5b9403.png

重叠子问题:

3ed79dd72b6610c5a463f16712695cf8.png

递归的定义最优解的代价:

d47a6cf4c6e9c0c0f4fc4f0f74d28fd4.png

cdce49f48e16af982899a1e53c1b74cc.png

自底向上的计算最优解的代价:

2c0ef3b72860d19049a54859af572265.png

算法的伪代码如下:

025281209a60ac69fa949c4e47ccde18.png

构造最优解:

41807648984980b048dbd0016c7829d0.png

算法的时间复杂度与空间复杂度分析:

27ae9126eb98e32f8e22a7c7cc442d45.png

例3: 0/1背包问题

2e20ccf9019884bd4ccbd56cc2621038.png

0007503546cebf86bffbad88303e86ea.png

思考 :

优化子结构:

390caa0eee57cc8be384ec130d3540d6.png

重叠子问题:

6b630841686d2ff8bce59f5363f38a8f.png

建立递归方程:

702fb1cb3f1785a610a07be142740382.png

a5f249db50021e032ac29c2e55509dee.png

自底向上的计算最优解的代价:

a31b1819f496c43b9c3fbbf526b8f404.png

算法的伪代码如下:

1a9020a9c2acc31ada59ab7adbc01e11.png

构造优化解:

51e90d874a02ca998b191481c40b56f3.png

算法复杂度分析:

4429fa2b537d455042c2d4f5ec63df32.png

例4: 最优的二叉搜索树

先来看下二叉搜索树的相关概念:(可以参考:二叉搜索树)

53a816324bbb27d2b9297e9990368a63.png

808f4e8d5305cb3a5080f0239a9d68ab.png

问题的定义:

8b519991bc20c16fc712bf54a4df4e98.png

思考 :该问题怎么去划分子问题?是否具有优化子结构呢?

4aba53ad0377c7457d07046b846ee4ca.png

优化子结构:

a45e28dd7952dba1d1ea99c1da4865e8.png

建立递归方程:

ce310fc5c7aa4bc4f01c19a271e55316.png

0fe2e477654d3b6045cf492aec9af459.png

所以:

3b5c06315a3d343f5f51dc5736f54851.png

自下而上的计算优化解的搜索代价:

04106b033fc64b0c7895e2b003027b61.png

8f9be654a7f3a95b021e3b691d51c5e3.png

算法伪代码如下:

e49af1f1f6d67f1cd47670e90f9965e3.png

其中:

abb5539a0cf1201baa3e76ecaeadce4b.png

算法的复杂度分析:

1e80915d69f647ee533c23f1fd5503e3.png

参考资源:

【1】哈工大骆吉洲《算法分析与设计》PPT

  • 3
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值