動(dòng)態(tài)規(guī)劃問題(1)——斐波那契數(shù)列

前段時(shí)間一直寫了幾個(gè)算法題目梨熙,發(fā)現(xiàn)有個(gè)很牛逼的算法,動(dòng)態(tài)規(guī)劃刀诬,雖然有的解題思路和動(dòng)態(tài)規(guī)劃很像咽扇,但是當(dāng)時(shí)不知道其中的原理和一些通用性,接下來(lái)的幾天,通過(guò)一些栗子一點(diǎn)一點(diǎn)揭開動(dòng)態(tài)規(guī)劃那神秘的面霜质欲,我也是現(xiàn)學(xué)現(xiàn)賣的树埠,如果有那里寫錯(cuò)的歡迎給我留言指正。

動(dòng)態(tài)規(guī)劃有時(shí)被稱為遞歸的相反的技術(shù)嘶伟。遞歸是從頂部開始將問題分解怎憋,通過(guò)解決所有分解小問題的方式,來(lái)解決整個(gè)問題九昧。而動(dòng)態(tài)規(guī)劃這是從底部開始解決問題绊袋,將所有小問題解決掉,然后合并成整體的解決方案耽装,從而解決掉整個(gè)大問題愤炸。遞歸方式雖然很簡(jiǎn)潔,但是效率不高掉奄,但是不能說(shuō)遞歸是不好的规个,本質(zhì)上是,命令式語(yǔ)言和面向?qū)ο蟮恼Z(yǔ)言對(duì)遞歸的實(shí)現(xiàn)不夠完善姓建,因?yàn)樗鼈儧]有將遞歸作為高級(jí)編程特性诞仓。

動(dòng)態(tài)規(guī)劃方案通常使用一個(gè)數(shù)組來(lái)建立一張表,用于存放被分解成眾多子問題的解速兔。當(dāng)算法執(zhí)行完畢墅拭,最終的解法將會(huì)在這個(gè)表中找到。

今天我們先從我們最熟的斐波那契數(shù)列數(shù)列開始涣狗。

0, 1, 1, 2, 3, 5, 8, 13, 21, 24, 55, ...

從數(shù)列中可以發(fā)現(xiàn)從第三個(gè)數(shù)開始的值是前兩個(gè)值的和谍婉。

遞歸解法
function fib(n){
    if(n < 2){
        return n;
    }else{
        return fib(n - 1) + fib(n - 2);
    }
}
console.log(fib(10));   // 55
動(dòng)態(tài)規(guī)劃解法
function fibDyn(n){
    var temp = [];
    for(var i = 0; i <= n; i++){
        temp[i] = 0
    }
    if(n == 1 || n == 2){
        return 1;
    }else{
        temp[1] = 1;
        temp[2] = 2; 
        for(var i = 3; i < n; i++){
            temp[i] = temp[i - 1] + temp[i -2];
        }
        return temp[i - 1];
    }
}
fibDyn(10)  // 55

從程序中我們可以看出,初始化了一個(gè)和傳入等長(zhǎng)的空數(shù)組镀钓,去存放每次運(yùn)算厚的結(jié)果穗熬。

測(cè)試程序運(yùn)行時(shí)間
var start = new Date().getTime();
console.log(fib(10))
var stop = new Date().getTime();
console.log('遞歸消耗' + (stop - start) + '毫秒');

start = new Date().getTime();
console.log(fibDyn(10))
stop = new Date().getTime();
console.log('動(dòng)態(tài)規(guī)劃消耗' + (stop - start) + '毫秒');

運(yùn)行結(jié)果

55
遞歸消耗-- 0 毫秒
55
動(dòng)態(tài)規(guī)劃消耗-- 0 毫秒

fib(20)

6765
遞歸消耗-- 1 毫秒
6765
動(dòng)態(tài)規(guī)劃消耗-- 0 毫秒

fib(30)

832040
遞歸消耗-- 17 毫秒
832040
動(dòng)態(tài)規(guī)劃消耗-- 0 毫秒

改變fib(n)中的 n 的值我們會(huì)發(fā)現(xiàn),動(dòng)態(tài)規(guī)劃的解決方案姚比遞歸解決方案高效很多丁溅。

優(yōu)化斐波那契數(shù)列的動(dòng)態(tài)規(guī)劃算法

我們看到這個(gè)動(dòng)態(tài)規(guī)劃的算法是要了一個(gè)空數(shù)組唤蔗,這是你可能已經(jīng)想到使用迭代的方案計(jì)算,可以不使用數(shù)組窟赏,需要用到的素組的原因事因?yàn)閯?dòng)態(tài)規(guī)劃算法通常需要吧中間的結(jié)果保存起來(lái)妓柜。一下是優(yōu)化的迭代版。

function fibDyn(n){
    var prev = 1;
    var middle = 1;
    var result = 1;

    for(var i = 2; i < n; i++){
        result = prev + middle;
        prev = middle;
        middle = result;
    }
    return result;
}
fibDyn(10)  // 55

這時(shí)候我們可以看到少了創(chuàng)建數(shù)組這一步涯穷,效率沒變棍掐,但是空間復(fù)雜度變小了。

斐波那契數(shù)列在很多地方都會(huì)用上拷况,我是從一個(gè)臺(tái)階問題發(fā)現(xiàn)的塌衰,同時(shí)知道了動(dòng)態(tài)規(guī)劃的解法诉稍。有興趣的可以在公眾號(hào)中回去“臺(tái)階問題”


*歡迎關(guān)注微信公眾賬號(hào)查看最新文章*
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市最疆,隨后出現(xiàn)的幾起案子杯巨,更是在濱河造成了極大的恐慌,老刑警劉巖努酸,帶你破解...
    沈念sama閱讀 212,185評(píng)論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件服爷,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡获诈,警方通過(guò)查閱死者的電腦和手機(jī)仍源,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái)舔涎,“玉大人笼踩,你說(shuō)我怎么就攤上這事⊥鱿樱” “怎么了嚎于?”我有些...
    開封第一講書人閱讀 157,684評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)挟冠。 經(jīng)常有香客問我于购,道長(zhǎng),這世上最難降的妖魔是什么知染? 我笑而不...
    開封第一講書人閱讀 56,564評(píng)論 1 284
  • 正文 為了忘掉前任肋僧,我火速辦了婚禮,結(jié)果婚禮上控淡,老公的妹妹穿的比我還像新娘嫌吠。我一直安慰自己,他們只是感情好掺炭,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,681評(píng)論 6 386
  • 文/花漫 我一把揭開白布居兆。 她就那樣靜靜地躺著,像睡著了一般竹伸。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上簇宽,一...
    開封第一講書人閱讀 49,874評(píng)論 1 290
  • 那天勋篓,我揣著相機(jī)與錄音,去河邊找鬼魏割。 笑死譬嚣,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的钞它。 我是一名探鬼主播拜银,決...
    沈念sama閱讀 39,025評(píng)論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼殊鞭,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了尼桶?” 一聲冷哼從身側(cè)響起操灿,我...
    開封第一講書人閱讀 37,761評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎泵督,沒想到半個(gè)月后趾盐,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,217評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡小腊,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,545評(píng)論 2 327
  • 正文 我和宋清朗相戀三年救鲤,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片秩冈。...
    茶點(diǎn)故事閱讀 38,694評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡本缠,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出入问,到底是詐尸還是另有隱情丹锹,我是刑警寧澤,帶...
    沈念sama閱讀 34,351評(píng)論 4 332
  • 正文 年R本政府宣布队他,位于F島的核電站卷仑,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏麸折。R本人自食惡果不足惜锡凝,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,988評(píng)論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望垢啼。 院中可真熱鬧窜锯,春花似錦、人聲如沸芭析。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)馁启。三九已至驾孔,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間惯疙,已是汗流浹背翠勉。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留霉颠,地道東北人对碌。 一個(gè)月前我還...
    沈念sama閱讀 46,427評(píng)論 2 360
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像蒿偎,于是被迫代替她去往敵國(guó)和親朽们。 傳聞我的和親對(duì)象是個(gè)殘疾皇子怀读,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,580評(píng)論 2 349

推薦閱讀更多精彩內(nèi)容