转载请标明地址或者附上我的博客地址https://georgedage.blog.csdn.net/
前言
最近接了一个项目,有关动态规划,客户提到,动态规划能和spark结合在一起吗?看来或许他对动态规划不是很熟悉,当然,我也不能说自己对其了如指掌,但是我们熟知,当我们说起动态规划的时候,往往是说的动态规划算法。既然是算法,那么它是可以运用到我们的程序中的,当然,前提业务需要,系统需要。
什么是动态规划?
在百度百科中,是这样解释动态规划的:
动态规划(dynamic programming)是运筹学的一个分支,是求解决策过程(decision process)最优化的数学方法。20世纪50年代初美国数学家R.E.Bellman等人在研究多阶段决策过程(multistep decision process)的优化问题时,提出了著名的最优化原理(principle of optimality),把多阶段过程转化为一系列单阶段问题,利用各阶段之间的关系,逐个求解,创立了解决这类过程优化问题的新方法——动态规划。1957年出版了他的名著《Dynamic Programming》,这是该领域的第一本著作。
好像听起来是有点繁琐,当然要这样,这样你就觉得他是比较高大上的了,就像最近《安家》电视剧中所说的——折衷主义,其实不就是混搭吗?那么我们在这高大上的概念中,怎么去理解它呢?
也就是说它的核心问题在哪?关键是什么?
其实坦白来说,动态规划问题的一般形式就是求最值。上面说到动态规划其实是运筹学的一种最优化方法,只不过在计算机问题上应用比较多,比如说让你求最长递增子序列呀,最小编辑距离呀等等。
既然是要求最值,核心问题是什么呢?求解动态规划的核心问题是穷举。因为要求最值,肯定要把所有可行的答案穷举出来,然后在其中找最值。
在百度百科对动态规划的概念意义中,一句话吸引了我,是这样说的:动态规划程序设计是对解最优化问题的一种途径、一种方法,而不是一种特殊算法。不像搜索或数值计算那样,具有一个标准的数学表达式和明确清晰的解题方法。动态规划程序设计往往是针对一种最优化问题,由于各种问题的性质不同,确定最优解的条件也互不相同,因而动态规划的设计方法对不同的问题,有各具特色的解题方法,而不存在一种万能的动态规划算法,可以解决各类最优化问题。因此读者在学习时,除了要对基本概念和方法正确理解外,必须具体问题具体分析处理,以丰富的想象力去建立模型,用创造性的技巧去求解。我们也可以通过对若干有代表性的问题的动态规划算法进行分析、讨论,逐渐学会并掌握这一设计方法。
这也就是我起这个标题的原因,DP实际意义上说是一个方法,并非一个算法!!
所以说当我们设计程序的时候,特别对于数据进行分析的时候,我们难免的会有求topN的请求,数据量小还好,当数据量大的时候,我们是不是要考虑到运用一些设计方法,一些算法,或者对系统进行调优。映射到我们设计的软件也是如此,当一个系统不断地增加功能,不断地有用户的涌进时,是不是要对系统进行优化,或者为了系统的 后期维护和整体代码的复用性,我们是不是要在编写系统的时候运用到一些设计模式。道理是相通的!
当然说这么点,有点针对前言的一个解释。下面以一些简洁的话语对DP进行解释:假设你正在使用适当的输入数据进行一些计算。你在每个实例中都进行了一些计算,以便得到一些结果。当你提供相同的输入时,你不知道会有相同的输出。这就像你在重新计算之前已经计算好的特定结果一样。那么问题出在哪里呢?你之前计算某些结果的宝贵时间被浪费掉了。你可以通过保存之前的计算结果去轻易地解决这个问题。比如通过使用恰当的数据结构。举个例子,你可以将输入输出作为键值对映射保存起来。现在通过分析这个问题,我们可以将新的输入(或者不在数据结构中的输入)与其对应的输出存储下来。或者在字典中查找输入并返回相应的输出结果。这样当你在进行一些计算时,你可以检查数据结构中是否存在该输入,如果数据输入存在的话就可以直接获得结果。我们将与这种方法相关的技巧称作动态规划。
一句话解释就是:我们可以说动态规划主要用来解决一些希望找到问题最优解的优化问题。
网上有不少运用动态规划的算法介绍,这里就不过多叙述。希望本篇让你对这个高大上的DP有认识上的一点见解。后期有空再更关于DP的运用!
参考:
https://baijiahao.baidu.com/s?id=1635388976060265522&wfr=spider&for=pc
百度百科