IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 数据结构与算法 -> 矩阵连乘C++ -> 正文阅读

[数据结构与算法]矩阵连乘C++

给定n个矩阵 { A 1 , A 2 , . . . , A n } \{A_1,A_2,...,A_n\} {A1?,A2?,...,An?},其中 A i A_i Ai? A i + 1 A_{i+1} Ai+1?是可乘的( i = 1 , 2 , . . . , n ? 1 i=1,2,...,n-1 i=1,2,...,n?1)。考察这n个矩阵连乘积 A 1 , A 2 , . . . , A n A_1,A_2,...,A_n A1?,A2?,...,An?
由于矩阵连乘法满足结合律,因此计算矩阵连乘积可有不同的计算次序。这种计算次序可以用加括号的方式来确定。若一个矩阵连乘积的计算次序完全确定,也就是说,该连乘积完全加括号,则可依次序反复调用两个矩阵相乘的标准算法计算出矩阵乘积。完全加括号的连乘可递归定义为:

  • 单个矩阵式完全加括号的;
  • 矩阵连乘积A是完全加阔i好的,则A可表示为两个完全加快了括号的矩阵连乘积B和C的乘积并加括号。

首先考虑计算两个矩阵连乘积所需的计算量。计算两个矩阵乘积的标准算法如下,其中ra,ca和rb,cb分别表示矩阵A和B的行数和列数

void matrixMultioply(int** a, int** b, int** c, int ra, int ca, int rb, int cb)
{
	if (ca!=rb)
	{
		error("矩阵不可乘");
	}
	for (int i = 0; i < ra; i++)
	{
		for (int j = 0;j < cb;j++)
		{
			int sum = a[i][0] + b[0][j];
			for (int k = 1; k < ca; k++)
			{
				sum += a[i][k] * b[k][j];
			}
			c[i][j] = sum;
		}
	}
}

分析最优解的结构

设计求解具体问题的动态规划算法的第一步是刻画该问题的最优解的特征结构。为方便起见,将矩阵连乘积 A i A i + 1 . . . A j A_i A_{i+1}...A_j Ai?Ai+1?...Aj?简计 A [ 1 : n ] A[1:n] A[1:n]的最优计算次序。

建立递归关系

设计动态规划算法的第2步时递归地定义最优值。对于矩阵连乘积地最优计算次序问题,设计算 A [ i : j ] A[i:j] A[i:j],所的最少数乘积次数为 m [ i [ [ j ] m[i[[j] m[i[[j],则原问题的最优值为 m [ 1 ] [ n ] m[1][n] m[1][n]
i = j i=j i=j时, A [ i : j ] = A i A[i:j]=A_i A[i:j]=Ai?为单一矩阵,无须计算,因此 m [ i ] [ i ] = 0 ( i = 1 , 2 , . . , n ) m[i][i]=0(i=1,2,..,n) m[i][i]=0(i=1,2,..,n)
i < j i<j i<j时,可利用最优子结构性质来计算 m [ i ] [ j ] m[i][j] m[i][j]。事实上,若计算 A [ i : j ] A[i:j] A[i:j]的最优次序在 A k ( i ≤ k < j ) A_k(i\le k<j) Ak?(ik<j) A k + 1 A_{k+1} Ak+1?之间断开,则 m [ i ] [ j ] = m [ i ] [ k ] + m [ k + 1 ] [ j ] + p i ? 1 p k p j m[i][j]=m[i][k]+m[k+1][j]+p_{i-1}p_k p_j m[i][j]=m[i][k]+m[k+1][j]+pi?1?pk?pj?。由于在计算时并不知道断开点k的位置,所有k还未定。不过k的位置只有 j ? i j-i j?i个可能,即 k ∈ i , i + 1 , . . . , j ? = 1 k\in{i,i+1,...,j-=1} ki,i+1,...,j?=1。因次,k是这j-i个位置中使计算量达到最小的哪个位置。从而, m [ i ] [ j ] m[i][j] m[i][j]可递归地定义为
m [ i ] [ j ] = { 0 i = j min ? i ≤ k < j { m i n [ i ] [ k ] + m [ k + 1 ] [ j ] + p i ? 1 p k p j } i < j m[i][j]=\left \{ \begin {aligned} 0 &&&&&&i=j \\ \min_{i\le k<j}\{min[i][k]+m[k+1][j]+p_{i-1}p_kp_j\}&&&&&& i<j \end {aligned} \right . m[i][j]=????0ik<jmin?{min[i][k]+m[k+1][j]+pi?1?pk?pj?}??????i=ji<j?
若将对应 m [ i ] [ j ] m[i][j] m[i][j]的断开位置k记为 s [ i ] [ j ] s[i][j] s[i][j],在计算出最优值 m [ i ] [ j ] m[i][j] m[i][j]后,递归地由 s [ i ] [ j ] s[i][j] s[i][j]构造出相应地最优解

计算最优值

void MatrixChian(int* p, int n, int** m, int** s)
{
	for (int i = 0; i <= n; i++)
	{
		m[i][i] = 0;
	}
	for (int  r = 0; r <= n; r++)
	{
		for (int i = 1;i <= n - r + 1;i++)
		{
			int j = i + r - 1;
			m[i][j] = m[i + 1][j] + p[i+1]*p[i] * p[i];
			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;
					s[i][j]= k;
				}
			}
			{

			}
		}
	}
}

构造最优解

void Traceback(int i, int j, int** s)
{
	if (i == j)
		return;
	Traceback(i, s[i][j], s);
	Traceback(s[i][j] + 1, j, s);
	cout << "Multiply A" << i << "," << s[i][j];
	cout << "and A" << (s[i][j] + 1) << "," << j << endl;
}
  数据结构与算法 最新文章
【力扣106】 从中序与后续遍历序列构造二叉
leetcode 322 零钱兑换
哈希的应用:海量数据处理
动态规划|最短Hamilton路径
华为机试_HJ41 称砝码【中等】【menset】【
【C与数据结构】——寒假提高每日练习Day1
基础算法——堆排序
2023王道数据结构线性表--单链表课后习题部
LeetCode 之 反转链表的一部分
【题解】lintcode必刷50题<有效的括号序列
上一篇文章      下一篇文章      查看所有文章
加:2021-09-14 13:36:45  更:2021-09-14 13:38:42 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/17 13:47:19-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码