算法导论示例-MatrixChain

原创 2006年06月14日 02:57:00
/**
 * Introduction to Algorithms, Second Edition 
 * 15.2 Matrix-chain multiplication
 * @author 土豆爸爸
 * 
 */
public class MatrixChain {
    public static int[][] order(int[] p) {
        int n = p.length - 1;
        int[][] m = new int[p.length][p.length];
        int[][] s = new int[p.length][p.length];
        for (int l = 2; l <= n; l++) {
            for (int i = 1; i <= n - l + 1; i++) {
                int j = i + l - 1;
                m[i][j] = Integer.MAX_VALUE;
                for (int k = i; k < j; k++) {
                    int 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 s;
    }
}

import junit.framework.TestCase;

public class MatrixChainTest extends TestCase {
    public void testMatrixChain() {
        int[] p = {30, 35, 15, 5, 10, 20 ,25};
        int[][] s = MatrixChain.order(p);
        print(s, 1, 6);
    }
    
    public void print(int[][] s, int i, int j) {
        if(i == j) {
            System.out.print("A" + i);
        } else {
            System.out.print("(");
            print(s, i, s[i][j]);
            print(s, s[i][j] + 1, j);
            System.out.print(")");
        }
    }
}

相关文章推荐

动态规划 (Dynamic Programming) 之 矩阵链乘法(Matrix Chain Multiplication)

这个问题是动态规划的基础的问题,也是算法导论中讨论过的问题。在这里先简单描述一下。假定有一组矩阵需要做乘法操作。但是我们知道首先矩阵乘法满足了结合律。所以可以按照不同的顺序做乘法。而且不同顺序做乘法最...
  • hhygcy
  • hhygcy
  • 2009年02月27日 15:36
  • 10171

算法导论15章 动态规划之矩阵链乘法问题

矩阵链乘法问题: 给定一个n个矩阵的序列(矩阵链),矩阵Ai的规模为Pi-1 * Pi, 求完全括号话方案,使得计算成绩A1*A2*......*An所需标量乘法次数最少。 注意:求解矩阵链乘法问题并...

0010算法笔记——【动态规划】矩阵连乘问题

问题描述:给定n个矩阵:A1,A2,...,An,其中Ai与Ai+1是可乘的,i=1,2...,n-1。确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。输入数据为矩阵个数和...

链式哈希表(Hash Table)--算法导论示例

In computer science, a hash table is an associative array data structure that associates keys with v...

《算法导论》习题解答 Chapter 22.1-6(求universal sink 通用汇点)

思路:设置两个游标i指向行,j指向列,如果arr[i][j]==1,则i=max{i+1,j},j++;如果arr[i][j]==0,则j=max{i+1,j+1}。 伪代码: has_uni...
  • hcbbt
  • hcbbt
  • 2013年07月17日 00:49
  • 1910

算法导论-12-1-具有相同关键字元素的二叉查找树

题目: 相同关键字的存在,给二叉查找树的实现带来了一些问题。 a)当用TREE-INSERT将n个具有相同关键字的数据项插入到一棵初始为空的二叉查找树中时,该算法的渐近性能如何? 我们可以对TR...

算法导论读书笔记(19)斐波那契堆

第五部分 高级数据结构第19章 斐波那契堆两种用途: 1. 支持一系列操作,这些操作构成了所谓的“可合并堆”; 2. 这些操作可以在常数摊还时间内完成,使得非常适合于需要频繁调用这些操作的应用; ...

实现算法导论第三版中的MergeSort

去掉了原算法中的无穷大值。代码如下: #include #include #include #include void mergeSort(char arr[], int p, int r...
  • dreamcs
  • dreamcs
  • 2017年05月05日 19:58
  • 264

【算法导论-36】并查集(Disjoint Set)详解

WiKiDisjoint是“不相交”的意思。Disjoint Set高效地支持集合的合并(Union)和集合内元素的查找(Find)两种操作,所以Disjoint Set中文翻译为并查集。 就《算法...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:算法导论示例-MatrixChain
举报原因:
原因补充:

(最多只允许输入30个字)