讨论动态规划的优点 - 相比于穷举法 - (以最短路径为例)

2024-02-25 00:18

本文主要是介绍讨论动态规划的优点 - 相比于穷举法 - (以最短路径为例),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

讨论动态规划的优点 - 相比于穷举法 - (以最短路径为例)

一、熟知动态规划有以下的优点:

优点1.减少了计算量,随着段数的增加,计算量大大减少。

优点2.计算中得到了很多有用的中间过程,不仅得到了出发点到终点的最短路径,而且得到了中间各点到终点的最短路径。

二、回顾动态规划的基本思想:


三、通过以下例子,我们将清楚的看到动态规划的优点:(以最短路径为例)

1、段数较少

以下的图为例


说明动态规划的优点,这里我们以整个过程中做的加法次数为指标,次数越少,我们认为计算量越好,效率越高。

穷举法的加法次数:1*2*3*1 = 6

动态规划(逆向D->A):2*3+1*2 = 8

(说明:动态规划第一步从B->D,不从C->D,C->D不存在选择最短路)

这个似乎不能说明动态规划比穷举法的计算量小,其实是阶段数较少,当阶段数增加后,动态规划的优势明显体现。

2、段数较多


(假设每一层的某个状态都可以到达下一层的每个状态)

穷举法的加法次数:1*2*3*4*4*3*2*1 = 576

动态规划(逆向D->A):3*2+4*3+4*4+3*4+2*3+1*2 = 54

这下明显可以看出动态的优势,大大减少了计算量;至于说得到有用的中间量,这个不用多解释。

3、量化直接说明动态规划减少计算量的优势

以二中的特殊情况为例,两边对称,段数为偶数的情况,所以一共有2n个阶段(加上始末)。

穷举法的加法次数:(1*2*3*…*n)^2 = (1*2*3*…*n)*(1*2*3*…*n

动态规划的加法次数:(n*n+(n-1)n+(n-2)(n-1)+...+1*2)*2-1*2(n*n+(n-1)n+(n-2)(n-1)+...+1*2)*2 < (n*n+(n-1)n+(n-2)n+...+1*n)*2 = (n+(n-1)+(n-2)+...+1)*n*2

当n>3时,(1*2*3*…*n)> (n+(n-1)+(n-2)+...+1) 这个成立,随着n变大差距越越大,毕竟是相乘嘛!

(1*2*3*…*n)> n*2

所以很明显,当段数增加时,动态规划的计算量是成倍成倍的减少。

四、注意动态规划中的无后效性(马尔可夫性)

如果某阶段状态给定后,则在这个阶段以后过程的发展不受这个阶段以前各段状态的影响;
过程的过去历史只能通过当前的状态去影响它未来的发展;构造动态规划模型时,要充分注意是否满足无后效性的要求;

这篇关于讨论动态规划的优点 - 相比于穷举法 - (以最短路径为例)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/743851

相关文章

SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志

《SpringBoot项目配置logback-spring.xml屏蔽特定路径的日志》在SpringBoot项目中,使用logback-spring.xml配置屏蔽特定路径的日志有两种常用方式,文中的... 目录方案一:基础配置(直接关闭目标路径日志)方案二:结合 Spring Profile 按环境屏蔽关

Java调用C#动态库的三种方法详解

《Java调用C#动态库的三种方法详解》在这个多语言编程的时代,Java和C#就像两位才华横溢的舞者,各自在不同的舞台上展现着独特的魅力,然而,当它们携手合作时,又会碰撞出怎样绚丽的火花呢?今天,我们... 目录方法1:C++/CLI搭建桥梁——Java ↔ C# 的“翻译官”步骤1:创建C#类库(.NET

MyBatis编写嵌套子查询的动态SQL实践详解

《MyBatis编写嵌套子查询的动态SQL实践详解》在Java生态中,MyBatis作为一款优秀的ORM框架,广泛应用于数据库操作,本文将深入探讨如何在MyBatis中编写嵌套子查询的动态SQL,并结... 目录一、Myhttp://www.chinasem.cnBATis动态SQL的核心优势1. 灵活性与可

VSCode设置python SDK路径的实现步骤

《VSCode设置pythonSDK路径的实现步骤》本文主要介绍了VSCode设置pythonSDK路径的实现步骤,包括命令面板切换、settings.json配置、环境变量及虚拟环境处理,具有一定... 目录一、通过命令面板快速切换(推荐方法)二、通过 settings.json 配置(项目级/全局)三、

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键

Mybatis嵌套子查询动态SQL编写实践

《Mybatis嵌套子查询动态SQL编写实践》:本文主要介绍Mybatis嵌套子查询动态SQL编写方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录前言一、实体类1、主类2、子类二、Mapper三、XML四、详解总结前言MyBATis的xml文件编写动态SQL

如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)

《如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)》:本文主要介绍如何更改pycharm缓存路径和虚拟内存分页文件位置(c盘爆红)问题,具有很好的参考价值,希望对大家有所帮助,如有... 目录先在你打算存放的地方建四个文件夹更改这四个路径就可以修改默认虚拟内存分页js文件的位置接下来从高级-

SpringBoot实现Kafka动态反序列化的完整代码

《SpringBoot实现Kafka动态反序列化的完整代码》在分布式系统中,Kafka作为高吞吐量的消息队列,常常需要处理来自不同主题(Topic)的异构数据,不同的业务场景可能要求对同一消费者组内的... 目录引言一、问题背景1.1 动态反序列化的需求1.2 常见问题二、动态反序列化的核心方案2.1 ht

golang实现动态路由的项目实践

《golang实现动态路由的项目实践》本文主要介绍了golang实现动态路由项目实践,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习... 目录一、动态路由1.结构体(数据库的定义)2.预加载preload3.添加关联的方法一、动态路由1

一文详解如何查看本地MySQL的安装路径

《一文详解如何查看本地MySQL的安装路径》本地安装MySQL对于初学者或者开发人员来说是一项基础技能,但在安装过程中可能会遇到各种问题,:本文主要介绍如何查看本地MySQL安装路径的相关资料,需... 目录1. 如何查看本地mysql的安装路径1.1. 方法1:通过查询本地服务1.2. 方法2:通过MyS