【算法设计与分析】动态规划:矩阵连乘

矩阵连乘问题的问题提出是,给定n个矩阵{A1, A2, …, An},Ai的维数为pi-1×pi,Ai与Ai+1是可乘的,i=1, 2 , …, n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序计算矩阵连乘积需要的数乘次数最少。
在这里插入图片描述
1)设有5个矩阵A1A2A3A4A5连乘,找出最优计算次序以使得矩阵连乘所需要的计算次数最少,采用动态规划法解决此问题。将算法编程实现, 并将程序与运算结果填写入实验结果。分析算法的时间复杂性,并用大Ο来表示其时间复杂性。

package test;

public class seven {
	static int[] p = {5,200,2,100,30,200};
	static int[][] m = new int[p.length-1][p.length-1] ,
				   s = new int[p.length-1][p.length-1];
	static int n = m.length;
	
	public static void main(String[] args) {
		MatrixChain(p,m,s);
		show(m);
		show(s);
		traceback(s,1,n-1);
	}
//	矩阵连乘
	public static void MatrixChain(int[] p ,  /*记录每个矩阵的行列维数,m*n,n*i,i*j*/
								   int[][] m ,/*记录数乘次数*/
								   int[][] s  /*记录最优断开位置*/)
	{
		for(int i = 1;i < n;++i) m[i][i] = 0;//单一矩阵计算量为0
		for(int r = 2;r < n;++r)
		{
			for(int i = 1;i < n-r+1;++i)//可以断开的位置区间为[1,n-r+1]
			{
				int j = i+r-1;//j指的是A[i:j]中最后一个矩阵
				m[i][j] = m[i][i] + m[i+1][j] + p[i-1] * p[i] * p[j];//(左子矩阵数组)最优解结构特征
				s[i][j] = i;//初始化,默认最优断开位置为第一个位置
				for(int k = i+1;k < j;++k)//右子矩阵数组
				{
					int t = m[i][k] + m[k+1][j] + p[i-1] * p[k] * p[j];//最优解结构特征
					if(t < m[i][j])//挑出最小连乘次
					{
						m[i][j] = t;//然后将确定的的最小连乘次记录到m表
						s[i][j] = k;//将k(最优断开位置,在索引前面切开)记录在s表
					}
				}
			}
		}
	}
//	断点矩阵s指示的加括号方式输出计算A[i:j]
	public static void traceback(int[][] s , int i , int j)
	{
		if(i == j) return;
		traceback(s,i,s[i][j]);
		traceback(s,s[i][j]+1,j);
		System.out.println("Multiply A"+i+","+s[i][j]+"and A"+(s[i][j]+1)+","+j);
	}
//	展示二维数组
	public static void show(int[][] a)
	{
		for(int i = 0;i < a.length;++i)
		{
			for(int j = 0;j < a[i].length;++j)
			{
				System.out.print(a[i][j]+" ");
			}
			System.out.println();
		}
		System.out.println();
	}
}

运行结果截图:
【算法设计与分析】动态规划:矩阵连乘_第1张图片
2)分析算法的时间复杂性,并用大Ο来表示其时间复杂性。

f(n) = n + (n - 1) * (n + c) * 3 + (n - 1) * (n + c) * (n- 3)

第一项n指的是第一个for循环,即单一矩阵计算量为0;
第二项(n - 1) * (n + c) * 3指的是第二个双重for循环里的前三句语句,构建m表并初始化s表
第三项(n - 1) * (n + c) * (n- 3)指的是三重for循环里的语句,列举剩余k(假设断开位置)的可能,选出最小数乘次数并记录到m表中,将最优断开位置记录到s表中。
O(n) = O(n³)

你可能感兴趣的:(算法,排序算法,矩阵)