何谓动态规划
动态规划,本质上讲,就是将一个动态系统中的一般规律提炼出来,利用该规律,使得本来需要确定的众多动态值可以经由数个必需的初始值和几个较为简单的算法推算得出。
生活中的动态规划
其实我们生活中便有许多动态规划的实例。我们这里就举一个小学时候的普通数学题——爬楼梯 来作为引子,来谈谈我们的动态规划。
如图所示一个楼梯,我们一次只能往上走一级楼梯,或者跨一步走两级楼梯。现在,假设我们要爬到第8级楼梯。我们有几种走法?(假设我们最初始位于第0级)
这道问题大家应该都见过,解法大家基本也都知道。要想知道走到第8级楼梯的方法数,只需要知道走到第8级楼梯的前两级,也就是第7级以及第6级的方法数,相加即可。
以此类推,我们便能发现,只需要知道走到第1级台阶和第2级台阶的数值便可以退出任意正数级台阶的方法数。
如果把这个问题搬到计算机上,那我们的代码大致框架就是这样了:
def 方法(台阶数N):
method[1] = 1 # method[i] 走到第i级台阶的方法数
method[2] = 2
while n <= N:
method[n] = method[n-1] + method[n-2]
return method[N]
如果现在告诉我们,在走到第1级和第2级台阶前,我们还有其他一段路要走,所以走到第1级和第2级台阶的方法数不再是1种和2种。也就是说,method[1]和method[1]不再为1和2了,这会影响到我们推算method[8]吗?
并不会,对吧?虽然走到第8级台阶的方法数可能会变化,不过规律并没有改变。我们依然可以通过这串代码来求得method[8]的数值,我们要做的只是修改method[1]和method[2]的数值。
找规律与动态规划
现在我们重新审视走台阶这个问题。
假设我们现在不知道一次能走几级楼梯,同时,问题要求我们回答method[1] ~ method[8]的全部数值。如此情况下,我们至少需要知道几个method[i]的数值呢?
答案很明了,我们必须一开始就知道8个method的数值,因为我们并没任何关于走楼梯的规律可循。
是的,这种规律,就是动态规划的核心。
如果这是在一个程序中,我们可以这样理解:
①在前一个问题中,我们只需要两个初始值method[1]和method[2],以及一个算法便可以获得一个数组的全部数据
②而在后一个问题中,我们需要知道N个初始值,才可以获得一个拥有N个数据的数组的全部数据。
如果在有规律的情况下,这就意味着我们可以用一定的运行时间来换取大量的内存空间。(我们只需要存储两个初始值,消耗一定运行时间去推算其他的数值)
如果我们要的是method[100000]的全部数据,这种用时间换取空间的做法,就是令人愉悦的事情了。我们可以大量的节省空间成本,花的只是几秒不到的运行时间的代价。
def 方法(method[1] , method[2],台阶数N):
method[1] = 1 # method[i] 走到第i级台阶的方法数
method[2] = 2
while n <= N:
method[n] = method[n-1] + method[n-2]
return method[N]
main(){
方法(method[1] , method[2], 100000)
#只需要这样,我们就能知道整个method[100000]的全部数据了
}
动态规划的核心
动态规划,简单讲就是找规律,就像考公一样,你只要找到规律,就是完成了动态规划的第一步。
但是,这并不是全部,动态规划也有自己的实际情况需要去考虑,就像治理国家一样,我们需要使用的是——符合"国情"的方针。
用我的理解来讲,动态规划的核心,就是用一般性的简单规律来代替大量的数据空间占用。
这句话的关键在于三点:一般性,简单和大量。
一般性:这个规律必须大部分情况适用。
如果求十个数值需要分别对应的九个不同算法和一个初始值,这种做是相当亏本的。动态规划的核心就是寻找通用规律来代替对每个数据的单独暴力计算/存储。
简单:这个规律必须相对简单。
如果我们走楼梯的规律很复杂,比如说求一个值需要几百次,甚至几千,几万次的计算。那就是相当的得不偿失。
大量:可以使用规律来求得的值,数量要大
夸张点讲,如果我这个数据,在这个程序结束寿命前,只会存三个数值,我却特意写个算法去推算它,那不是太浪费时间了吗?至少也得来个十几个吧?
在达成这三个条件下的找规律,然后用算法将他们串起来,便是动态规划。
结语
动态规划要说难度,本身并不难,因为它的本质就是找规律,然后用规律求值,存值。这已经是刻入我们脑子里的技能。
不过,实际使用中的动态规划,往往还挺麻烦的。因为实际使用中,不仅是数据情况不一样,规律有时候并不是简单能确定的。
其实一个成熟的天气预报数据模型也算是动态规划
动态的填入每日的各种气象数据,然后求出之后的天气。如果这个模型完全并且初始值完全,甚至可以求得很多天之后的天气。但是这个模型,也就是规律本身,成为了最大的难点。
因此它并不符合简单这个特点,所以被踢去了大数据(笑
当然,我对动态规划的理解可能也有一些错误,如果有什么错误,也请各位指出。
这里是夜行,我们下周再见。
是的,因为看到有人点赞了,而且阅览数也上去了。咱开始打算周更了,每周学点东东一起分享。