《算法导论》学习笔记之Chapter4.2矩阵乘法Strassen

2024-05-16 00:18

本文主要是介绍《算法导论》学习笔记之Chapter4.2矩阵乘法Strassen,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

4.2 矩阵乘法,代码如下:

//求两个方阵的乘积public static int[][] squareMatrixMultiply(int[][] a, int[][] b){int n = a.length;int[][] c = new int[n][n];for (int i = 0; i < n; i++){for (int j = 0; j < n; j++){c[i][j] = 0;for (int k = 0; k < n; k++){c[i][j] = c[i][j] + a[i][k] * b[k][j];}}}return c;}

上述直接计算矩阵乘积的算法时间复杂度有θ(n.^3)。如果采用分治策略,递归算法进行矩阵乘积计算,时间复消耗T(n) = 8T(n/1) + θ(n.^2);

下面介绍一个速度更快的算法,Strassen算法:其实该算法步骤很简单,很好实现,但是实现起来较为繁琐(此处是指用java语言实现),这里就只记下其原理,实现步骤:

(1)将矩阵(方阵,且n是2的幂)A,B,C均分解为四个子矩阵;

(2)创建10个n/2 * n/2的方阵S1,。。。S10,而Sn如下:

                                      S1 = B12-B22;S2=A11+A12;.......S10=B11+B12

(3)用步骤1和步骤2中的矩阵,递归的计算7个矩阵乘积P1,...P7:

                                              P1=A11*S1;P2=S2*B22 ....P7=S9*S10;

(4)对步骤3创建的Pi矩阵进行加减运算,即可求出C的4个子矩阵:

                                     C11=P5+P4-P2+P6;......C22=P5+P1-P3-P7;


从上述步骤可知,个人觉得该算法没有什么特殊意义,就是发现了其中的冗余计算步骤(但是我没仔细推敲),在单纯的分治算法递归的基础上进行一些改进,使基本的8次矩阵乘法,变成了现在的7次矩阵乘法,说明8次矩阵乘法运算中又一次是多余的,就把这次多余的矩阵乘法,通过矩阵加减运算进行替代,提升了算法速度。Strassen使得时间复杂度变为T(n) = 7T(n/2) + θ(n.^2),即n的2次方。

在n较小时,Strassen算法可能不如直接算法快,但当n很大时,Strassen算法会快于直接算法。

在实际应用中,稠密矩阵的快速乘法程序在矩阵规模超过一个交叉点时使用Strassen算法,一旦子问题规模降低到交叉点之下,就切换到一个简单的方法。交叉点的大小依赖于具体系统。



这篇关于《算法导论》学习笔记之Chapter4.2矩阵乘法Strassen的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/993325

相关文章

Java中的雪花算法Snowflake解析与实践技巧

《Java中的雪花算法Snowflake解析与实践技巧》本文解析了雪花算法的原理、Java实现及生产实践,涵盖ID结构、位运算技巧、时钟回拨处理、WorkerId分配等关键点,并探讨了百度UidGen... 目录一、雪花算法核心原理1.1 算法起源1.2 ID结构详解1.3 核心特性二、Java实现解析2.

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C/C++中OpenCV 矩阵运算的实现

《C/C++中OpenCV矩阵运算的实现》本文主要介绍了C/C++中OpenCV矩阵运算的实现,包括基本算术运算(标量与矩阵)、矩阵乘法、转置、逆矩阵、行列式、迹、范数等操作,感兴趣的可以了解一下... 目录矩阵的创建与初始化创建矩阵访问矩阵元素基本的算术运算 ➕➖✖️➗矩阵与标量运算矩阵与矩阵运算 (逐元

使用雪花算法产生id导致前端精度缺失问题解决方案

《使用雪花算法产生id导致前端精度缺失问题解决方案》雪花算法由Twitter提出,设计目的是生成唯一的、递增的ID,下面:本文主要介绍使用雪花算法产生id导致前端精度缺失问题的解决方案,文中通过代... 目录一、问题根源二、解决方案1. 全局配置Jackson序列化规则2. 实体类必须使用Long封装类3.

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Springboot实现推荐系统的协同过滤算法

《Springboot实现推荐系统的协同过滤算法》协同过滤算法是一种在推荐系统中广泛使用的算法,用于预测用户对物品(如商品、电影、音乐等)的偏好,从而实现个性化推荐,下面给大家介绍Springboot... 目录前言基本原理 算法分类 计算方法应用场景 代码实现 前言协同过滤算法(Collaborativ

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

利用Python快速搭建Markdown笔记发布系统

《利用Python快速搭建Markdown笔记发布系统》这篇文章主要为大家详细介绍了使用Python生态的成熟工具,在30分钟内搭建一个支持Markdown渲染、分类标签、全文搜索的私有化知识发布系统... 目录引言:为什么要自建知识博客一、技术选型:极简主义开发栈二、系统架构设计三、核心代码实现(分步解析