(7) 動(dòng)態(tài)規(guī)劃(下) 矩陣鏈乘與OBST樹(shù)

矩陣鏈乘問(wèn)題

問(wèn)題描述:
如何實(shí)現(xiàn)對(duì)A1·A2·A3...An個(gè)矩陣鏈乘的打括號(hào)(分割), 使得其乘法次數(shù)m是最少的?
已知: A[x,y] B[y,z] 兩個(gè)矩陣相乘, 消耗的乘法次數(shù)是x · y · z次;

  • 最優(yōu)子結(jié)構(gòu): 最后一次分割選擇了一個(gè)位置后, 左右兩個(gè)block的本身已經(jīng)應(yīng)該被最優(yōu)分割過(guò)了.
  • 遞歸式:
    m(i, j) = min{ m(i,k) + m(k+1,j) + p[i-1]·p[k]·p[j] } , 當(dāng)i<j;
    m(i, j) = 0, 當(dāng)i=j
    • 其實(shí)從這個(gè)遞歸式能看出, 寫(xiě)算法的時(shí)候要有一個(gè)k循環(huán), 把k從k=i~j-1所有位置的可能情況都遍歷一遍, 找min;
  • 寫(xiě)出自底向上的計(jì)算方法: 動(dòng)態(tài)規(guī)劃節(jié)省時(shí)間的奧秘在自底向上計(jì)算, 也就是和最開(kāi)始寫(xiě)最優(yōu)子結(jié)構(gòu)剛好相反, 從m(i, i) -> m(i, i+1) -> m(i, i+2)這樣算;
    • 長(zhǎng)度l=1, 即只有一個(gè)矩陣的邊界情況, m(i, i) = 0 (i=1~n進(jìn)行遍歷)
    • 長(zhǎng)度l=2, j = i+1, 有兩個(gè)矩陣, k只有一個(gè)值, 即取i, m(i, j) = p[i-1]·p[i]·p[j]; 同樣進(jìn)行遍歷, i = 1~n-1, j = 2~n
    • 長(zhǎng)度l=3, j = i+2, 這次每個(gè)block有3個(gè)矩陣, k有i, i+1兩個(gè)取值, m(i, j) = min {k=i情形的值, k=i+1情形的值};
    • 剩下以此類(lèi)推...一直到長(zhǎng)度l = n為止.
/*Matrix-Chain-Order*/
//@p: 從p[0]~p[n], 代表A[1]~A[n]矩陣的行數(shù)和列數(shù);
//其中, A[1]為p[0]xp[1]規(guī)模, A[x]為p[x-1]p[x]規(guī)模
Matrix-Chain-Order(int p[])
n = p.length-1;
let m[1~n][1~n] and s[1~n][1~n] be new arrays;
for (i = 1~n)
    m[i][i] = 0;  //m[i][i] 其實(shí)就是A[i]自己一個(gè)p[i-1]*p[i]規(guī)模的矩陣, 類(lèi)似于遞歸樹(shù)的T(1)根部情形;
for (l = 2 ~ n)  // l: length
    for (i = 1 ~ n-l+1)  //i: head of a block;
        j = i+l-1;  //j: end of a block;
        m[i][j] = 9999;  //放一個(gè)無(wú)窮大值, 等著被替換;
        for (k = i ~ k-1)  //k: 代表砍下分割成兩個(gè)block的位置, 注意是在A[k]矩陣的右側(cè)分開(kāi)來(lái);
            q = m[i][k] + m[k+1][j] + p[i-1]*p[k]*p[j]
            if (q <= m[i][j])
                m[i][j] = q;
                s[i][j] = k; //記錄分割位置;
return m, s arrays;

時(shí)間復(fù)雜度: 有三層for循環(huán), 所以T(n) = Θ(n^3)

最優(yōu)二分搜索樹(shù)

問(wèn)題描述: a[1]~a[n]的關(guān)鍵字, 已知出現(xiàn)概率為p[1]~p[n], 另外落入a[i]兩側(cè)間隙的概率是q[0]~q[n], 求最小比較次數(shù)e和OBST的構(gòu)成; 其中q[i]代表是落入(i, i+1)區(qū)間的概率

  • 最優(yōu)子結(jié)構(gòu): 最頂層根節(jié)點(diǎn)選擇了a[1]~a[n]其中一個(gè)以后, 左右子樹(shù)都也已經(jīng)是最優(yōu)子樹(shù)了.

  • 遞歸式: e(i, j) =
    (1) min { e(i, k-1) + e(k+1, j) + [ p[k]·1+w(i, k-1)+w(k+1, j) ] } , 當(dāng)i<=j (note: 此處中括號(hào)中的部分可以化為w(i, j) )
    (2) q(i-1) , 當(dāng)i>j (比如e(4, 3)這樣)

  • 寫(xiě)出自底向上的計(jì)算方法: 這時(shí)候要用相反的思路, 從樹(shù)底層往上算, 底層是那些偽結(jié)點(diǎn), 也就是q[0]~q[n]代表的結(jié)點(diǎn)

    • 長(zhǎng)度l=0, 是邊界條件情況, e[i, i-1] = q[i-1] , 讓i = 1~n+1遍歷一下, 從而過(guò)完q[0]~q[n]; 也不要忘了把輔助的"概率和的矩陣"w[i, i-1] = q[i-1]一起過(guò)一下;
    • 長(zhǎng)度l=1, k只能取i, 所以e[i, i] = e[1, 0] + e[2, 1] + w[1, 1], 同樣讓i = 1~n遍歷一下;
    • 長(zhǎng)度l=2, k能取i, i+1=j兩個(gè)值, 所以e[i, j] = min{ k=i情形, k=i+1情形 };
    • 剩下以此類(lèi)推...一直到長(zhǎng)度l = n 為止;
/*Optimal-Binary-Search-Tree*/
//@p: p[n]存放著a[1]~a[n]關(guān)鍵詞出現(xiàn)的概率
//@q: q[n+1]存放著q[0]~q[n]的落入缺失區(qū)間的概率
//即q[i]是落入(a[i],a[i+1]) 開(kāi)區(qū)間的概率
Optimal-BST(p[], q[], n)
let e[1~n+1][0~n], w[1~n+1][0~n], root[1~n][1~n] be new arrays;
for (i = 1~n+1)
    e[i][i-1] = q[i-1];  //邊界情況, 覆蓋了落入小于a[i]的情形
    w[i][i-1] = q[i-1]; 
for (l = 1~n)
    for (i = 1~n-l+1)    //i是頭部
        j = i+l-1;  //j是尾部
        e[i][j] = 9999;  //讓e[i][j]無(wú)窮大
        w[i][j] = w[i][j-1] + p[j] + q[j]
        for (k = i~j)
            t = e[i, k-1] + e[k+1, j] + w[i][j];
            if (t<=e[i][j])
                e[i][j] = t;
                root[i][j] = k;
return e, root arrays;

時(shí)間復(fù)雜度: 因?yàn)橛腥龑觙or循環(huán), 所以T(n)=Θ(n^3);

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末室囊,一起剝皮案震驚了整個(gè)濱河市诗舰,隨后出現(xiàn)的幾起案子管挟,更是在濱河造成了極大的恐慌,老刑警劉巖女坑,帶你破解...
    沈念sama閱讀 221,273評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡营罢,警方通過(guò)查閱死者的電腦和手機(jī)豺型,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,349評(píng)論 3 398
  • 文/潘曉璐 我一進(jìn)店門(mén)仲智,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人姻氨,你說(shuō)我怎么就攤上這事钓辆。” “怎么了肴焊?”我有些...
    開(kāi)封第一講書(shū)人閱讀 167,709評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵前联,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我娶眷,道長(zhǎng)似嗤,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 59,520評(píng)論 1 296
  • 正文 為了忘掉前任届宠,我火速辦了婚禮烁落,結(jié)果婚禮上乘粒,老公的妹妹穿的比我還像新娘。我一直安慰自己伤塌,他們只是感情好灯萍,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,515評(píng)論 6 397
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著每聪,像睡著了一般旦棉。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上药薯,一...
    開(kāi)封第一講書(shū)人閱讀 52,158評(píng)論 1 308
  • 那天绑洛,我揣著相機(jī)與錄音,去河邊找鬼果善。 笑死诊笤,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的巾陕。 我是一名探鬼主播讨跟,決...
    沈念sama閱讀 40,755評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼鄙煤!你這毒婦竟也來(lái)了晾匠?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 39,660評(píng)論 0 276
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤梯刚,失蹤者是張志新(化名)和其女友劉穎凉馆,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體亡资,經(jīng)...
    沈念sama閱讀 46,203評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡澜共,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,287評(píng)論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锥腻。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片嗦董。...
    茶點(diǎn)故事閱讀 40,427評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖瘦黑,靈堂內(nèi)的尸體忽然破棺而出京革,到底是詐尸還是另有隱情,我是刑警寧澤幸斥,帶...
    沈念sama閱讀 36,122評(píng)論 5 349
  • 正文 年R本政府宣布匹摇,位于F島的核電站,受9級(jí)特大地震影響甲葬,放射性物質(zhì)發(fā)生泄漏廊勃。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,801評(píng)論 3 333
  • 文/蒙蒙 一演顾、第九天 我趴在偏房一處隱蔽的房頂上張望供搀。 院中可真熱鬧隅居,春花似錦钠至、人聲如沸葛虐。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 32,272評(píng)論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)屿脐。三九已至,卻和暖如春宪卿,著一層夾襖步出監(jiān)牢的瞬間的诵,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 33,393評(píng)論 1 272
  • 我被黑心中介騙來(lái)泰國(guó)打工佑钾, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留西疤,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 48,808評(píng)論 3 376
  • 正文 我出身青樓休溶,卻偏偏與公主長(zhǎng)得像代赁,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子兽掰,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,440評(píng)論 2 359

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

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些閱讀 2,034評(píng)論 0 2
  • 在C語(yǔ)言中,五種基本數(shù)據(jù)類(lèi)型存儲(chǔ)空間長(zhǎng)度的排列順序是: A)char B)char=int<=float C)ch...
    夏天再來(lái)閱讀 3,349評(píng)論 0 2
  • 計(jì)算機(jī)二級(jí)C語(yǔ)言上機(jī)題庫(kù)(南開(kāi)版) 1.m個(gè)人的成績(jī)存放在score數(shù)組中芭碍,請(qǐng)編寫(xiě)函數(shù)fun,它的功能是:將低于平...
    MrSunbeam閱讀 6,389評(píng)論 1 42
  • 一年級(jí)語(yǔ)文上冊(cè)生字表 生字表一(共400字) 啊(ā)愛(ài)(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang閱讀 2,804評(píng)論 0 6
  • 春天是萬(wàn)物復(fù)蘇的季節(jié),也是陽(yáng)氣升發(fā)的季節(jié)孽尽。 在這充滿綠色氣息的時(shí)節(jié)里窖壕,我們不僅能感受到意氣風(fēng)發(fā),還會(huì)感受到困倦嗜睡...
    食物鏈頂端閱讀 331評(píng)論 0 1