(7) 动态规划(下) 矩阵链乘与OBST树

矩阵链乘问题

问题描述:
如何实现对A1·A2·A3...An个矩阵链乘的打括号(分割), 使得其乘法次数m是最少的?
已知: A[x,y] B[y,z] 两个矩阵相乘, 消耗的乘法次数是x · y · z次;

  • 最优子结构: 最后一次分割选择了一个位置后, 左右两个block的本身已经应该被最优分割过了.
  • 递归式:
    m(i, j) = min{ m(i,k) + m(k+1,j) + p[i-1]·p[k]·p[j] } , 当i<j;
    m(i, j) = 0, 当i=j
    • 其实从这个递归式能看出, 写算法的时候要有一个k循环, 把k从k=i~j-1所有位置的可能情况都遍历一遍, 找min;
  • 写出自底向上的计算方法: 动态规划节省时间的奥秘在自底向上计算, 也就是和最开始写最优子结构刚好相反, 从m(i, i) -> m(i, i+1) -> m(i, i+2)这样算;
    • 长度l=1, 即只有一个矩阵的边界情况, m(i, i) = 0 (i=1~n进行遍历)
    • 长度l=2, j = i+1, 有两个矩阵, k只有一个值, 即取i, m(i, j) = p[i-1]·p[i]·p[j]; 同样进行遍历, i = 1~n-1, j = 2~n
    • 长度l=3, j = i+2, 这次每个block有3个矩阵, k有i, i+1两个取值, m(i, j) = min {k=i情形的值, k=i+1情形的值};
    • 剩下以此类推...一直到长度l = n为止.
/*Matrix-Chain-Order*/
//@p: 从p[0]~p[n], 代表A[1]~A[n]矩阵的行数和列数;
//其中, A[1]为p[0]xp[1]规模, A[x]为p[x-1]p[x]规模
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] 其实就是A[i]自己一个p[i-1]*p[i]规模的矩阵, 类似于递归树的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;  //放一个无穷大值, 等着被替换;
        for (k = i ~ k-1)  //k: 代表砍下分割成两个block的位置, 注意是在A[k]矩阵的右侧分开来;
            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;

时间复杂度: 有三层for循环, 所以T(n) = Θ(n^3)

最优二分搜索树

问题描述: a[1]~a[n]的关键字, 已知出现概率为p[1]~p[n], 另外落入a[i]两侧间隙的概率是q[0]~q[n], 求最小比较次数e和OBST的构成; 其中q[i]代表是落入(i, i+1)区间的概率

  • 最优子结构: 最顶层根节点选择了a[1]~a[n]其中一个以后, 左右子树都也已经是最优子树了.

  • 递归式: e(i, j) =
    (1) min { e(i, k-1) + e(k+1, j) + [ p[k]·1+w(i, k-1)+w(k+1, j) ] } , 当i<=j (note: 此处中括号中的部分可以化为w(i, j) )
    (2) q(i-1) , 当i>j (比如e(4, 3)这样)

  • 写出自底向上的计算方法: 这时候要用相反的思路, 从树底层往上算, 底层是那些伪结点, 也就是q[0]~q[n]代表的结点

    • 长度l=0, 是边界条件情况, e[i, i-1] = q[i-1] , 让i = 1~n+1遍历一下, 从而过完q[0]~q[n]; 也不要忘了把辅助的"概率和的矩阵"w[i, i-1] = q[i-1]一起过一下;
    • 长度l=1, k只能取i, 所以e[i, i] = e[1, 0] + e[2, 1] + w[1, 1], 同样让i = 1~n遍历一下;
    • 长度l=2, k能取i, i+1=j两个值, 所以e[i, j] = min{ k=i情形, k=i+1情形 };
    • 剩下以此类推...一直到长度l = n 为止;
/*Optimal-Binary-Search-Tree*/
//@p: p[n]存放着a[1]~a[n]关键词出现的概率
//@q: q[n+1]存放着q[0]~q[n]的落入缺失区间的概率
//即q[i]是落入(a[i],a[i+1]) 开区间的概率
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[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;

时间复杂度: 因为有三层for循环, 所以T(n)=Θ(n^3);

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容

  • "use strict";function _classCallCheck(e,t){if(!(e instanc...
    久些阅读 2,028评论 0 2
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,339评论 0 2
  • 计算机二级C语言上机题库(南开版) 1.m个人的成绩存放在score数组中,请编写函数fun,它的功能是:将低于平...
    MrSunbeam阅读 6,338评论 1 42
  • 一年级语文上册生字表 生字表一(共400字) 啊(ā)爱(ài)安(ān)岸(àn)爸(bà)八(bā)巴(bā)...
    meychang阅读 2,785评论 0 6
  • 春天是万物复苏的季节,也是阳气升发的季节。 在这充满绿色气息的时节里,我们不仅能感受到意气风发,还会感受到困倦嗜睡...
    食物链顶端阅读 326评论 0 1