常见算法思想之动态规划_贪婪算法

本文探讨了动态规划和贪婪算法的思想。动态规划通过解决子问题并存储结果以避免重复计算,达到解决复杂问题的目的,如斐波那契数列问题。贪婪算法则每次选择局部最优解,但不保证全局最优,例如在背包问题中的应用。两者都是将大问题分解为子问题,但动态规划适用于有最优子结构和重叠子问题的情况,而贪婪算法通常得到近似解。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.动态规划

最近总是跟动态规划打交道,索性就将其弄明白一点。所谓的动态规划并不是一种具体的算法,而是一种算法的思想。思想总是抽象的,缥缈的。所以在学习动态规划的时候会有一种很尴尬的情况,就是感觉这个东西很简单,但是又不知道自己是不是真的学会了。
简单的来说,动态规划就是将一个大问题分解为子问题,然后根据子问题的解求出原问题的解。它适用于有重复子问题(在问题计算的过程中,子问题要被重复计算多次)和最优子结构(局部最优解能决定全局最优解)的问题。
根据问题的这两个特征,我们很容易去简化这类问题:1.重复子问题:将子问题的结果进行存储,下次使用的时候直接调用,而不是每次都重新计算一遍。 2.最优子结构: 按顺序计算子问题的解,并且推导出子问题和下一个子问题之间的状态转移方程。随着最后一个子问题的解决,整体的问题也就解决了。
这就是动态规划的思想了,其实也就是针对某一类特定的问题,得到简化这类问题的办法。我们之前聊过的前向后向算法,维特比算法,CTC损失等都是这类思想的实际应用。当然,如何将思想在实地应用,还需要更多的努力。目前我还只是去学习别人在特定问题上应用的套路而已。

1.2.动态规划的例子

这是一个简单的例子,
斐波那契数列:0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233……
它遵循这样一个规律:每一数都是前面两个数的和
我们可以使用传统的递归的方式来实现,但是其复杂度是指数级的,我们知道指数级就相当于是不可用。实际测试了一下,计算100的斐波拉契数列,那个慢呀?唐僧也会愁到骂娘的。
我们使用动态规划的思想分析一下问题,首先计算每一数的时候,前面所有的数都得重新计算一下,符合重叠子问题。其次最终问题的最优解包含的前面的数也是最优解,符合最优子结构。所以可以使用动态规划的思想来解决。
1.建立状态转移方程:results[i] = results[i-1]+results[i-2]
2.使用results 存储已解决子问题的解
3.从小到大的顺序计算每一个值
整体的复杂度为 O ( n ) O(n) O(n),对比原来的 O ( 2 n ) O(2^n) O(2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值