五、分治法应用--矩阵乘法

1 朴素算法

这个算法就是矩阵乘法的定义:
在这里插入图片描述

  • 很容易看出这个算法复杂度是Θ(n3)\Theta(n^3)Θ(n3)

2 递归算法

分治法首先是从分割问题开始的,得到数学上的递归关系后,然后使用递归的方式实现。
在这里插入图片描述
由上面的数学性质,可以使用递归实现:
在这里插入图片描述

  • T(n)=8T(n/2)+Θ(n2)T(n)=8T(n/2)+\Theta(n^2)T(n)=8T(n/2)+Θ(n2),应用主定理可知,T(n)=Θ(n3)T(n)=\Theta(n^3)T(n)=Θ(n3),没有什么进步,不过这里分割思路是没有问题的,只不过还有一步技巧性较强的变换在里面。

3 Strassen’s algorithm for matrix multiplication

1969年,斯特拉森(V.Strassen)利用分治策略并加上数学处理设计出了一种时间复杂度是O(n2.81)O(n^{2.81})O(n2.81)(准确地说是O(nlog7)O(n^{log7})O(nlog7))的矩阵相乘算法,宣称在时间复杂度数量级上有所突破。此结果一发布,立即震动了整个数学界。

整个算法的核心是在分块的基础上做了一步变换,这个变换甚至高中生都可以看懂,但是只有牛人想的到。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
得到上面的问题分割方式后,仿照递归算法容易实现。

  • T(n)=7T(n/2)+Θ(n2)T(n)=7T(n/2)+\Theta(n^2)T(n)=7T(n/2)+Θ(n2),应用主定理可知,T(n)=Θ(nlog7)T(n)=\Theta(n^{log7})T(n)=Θ(nlog7)

4 实现

为便于说明问题这里仅考虑矩阵阶数为2n2^n2n的情况。

# -* coding: utf-8 -*-import numpy as np
from timeit import default_timer as timerdef STRASSEN_MATRIX(A, B):n = A.shape[0]C = np.array([0] * (n * n)).reshape((n, n))d = int(n / 2)if n == 1:C[0, 0] = A[0, 0] * B[0, 0]else:S1 = B[0:d, d:n] - B[d:n, d:n]S2 = A[0:d, 0:d] + A[0:d, d:n]S3 = A[d:n, 0:d] + A[d:n, d:n]S4 = B[d:n, 0:d] - B[0:d, 0:d]S5 = A[0:d, 0:d] + A[d:n, d:n]S6 = B[0:d, 0:d] + B[d:n, d:n]S7 = A[0:d, d:n] - A[d:n, d:n]S8 = B[d:n, 0:d] + B[d:n, d:n]S9 = A[0:d, 0:d] - A[d:n, 0:d]S10 = B[0:d, 0:d] + B[0:d, d:n]P1 = STRASSEN_MATRIX(A[0:d, 0:d], S1)P2 = STRASSEN_MATRIX(S2, B[d:n, d:n])P3 = STRASSEN_MATRIX(S3, B[0:d, 0:d])P4 = STRASSEN_MATRIX(A[d:n, d:n], S4)P5 = STRASSEN_MATRIX(S5, S6)P6 = STRASSEN_MATRIX(S7, S8)P7 = STRASSEN_MATRIX(S9, S10)C[0:d, 0:d] = P5 + P4 - P2 + P6C[0:d, d:n] = P1 + P2C[d:n, 0:d] = P3 + P4C[d:n, d:n] = P5 + P1 - P3 - P7return Cdef run_time():tic = timer()# 待测试的代码toc = timer()print(toc - tic)  # 输出的时间,秒为单位if __name__ == '__main__':A = np.array(list(range(0, 16))).astype(int).reshape((4, 4))B = np.array(list(range(2, 18))).astype(int).reshape((4, 4))print('strassen:\n', STRASSEN_MATRIX(A, B))print('dot:\n', np.dot(A, B))

运行结果:

strassen:[[ 68  74  80  86][196 218 240 262][324 362 400 438][452 506 560 614]]
dot:[[ 68  74  80  86][196 218 240 262][324 362 400 438][452 506 560 614]]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420726.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

POJ 1300 Door Man(欧拉回路的判定)

题目链接 题意 : 庄园有很多房间,编号从0到n-1,能否找到一条路径经过所有开着的门,并且使得通过门之后就把门关上,关上的再也不打开,最后能回到编号为0的房间。 思路 : 这就是一个赤裸裸的判断欧拉通路的问…

bootstrap guide

bootstrap1. bootstrap 简单介绍2. demo演示3. 关于bootstrap使用注意的点1. bootstrap 简单介绍 起源 来自Twitter,是目前最受欢迎的前端框架。基于HTML、CSS、Javascript。Bootstrap js组件依赖于jquery 3.X简洁灵活,使得Web开发更加快捷。官网 https…

六、Analysis of quicksort

1 引言 如题目所示,本节的精华在于用数学解决一个直觉上看似纷乱复杂的问题,里面有一些一般性的分析方法,如引入Indicator变量,从而把不确定问题引入到概率框架进行分析,一步一步把直觉上混乱的问题理清楚&#xff0c…

Javaweb maven项目tomcat报错: javax.naming.NamingException: 无法创建资源实例

报错地址 2. 原因分析 1. Resource注解无效,注入失败,你得从容器中把bookInfoServie取去来,用getBean的方式创建BookInfoServiceImpl对象 2.删掉Resource注解,重新部署搞定。3.不要在意写了个Contorller, 初学spring,…

如何给APK文件签名

转载地址:http://www.apkbus.com/forum.php?modviewthread&tid1264211.签名的意义   为了保证每个应用程序开发商合法ID,防止部分开放商可能通过使用相同的Package Name来混淆替换已经安装的程序,我们需要对我们发布的APK文件进行唯一…

七、基于比较的排序算法总结

1 问题 至此,总结一下已经研究过的排序算法: insertion sort,Θ(n2)\Theta(n^2)Θ(n2) merge sort, Θ(nlogn)\Theta(nlogn)Θ(nlogn) quicksort, Θ(nlogn)\Theta(nlogn)Θ(nlogn) heapsort,Θ(nlogn)\Theta(nlogn)Θ(nlogn) 从上面这个现象…

转账为demo,spring事务

spring 事务使用1. 业务代码2. xml配置3. 注解配置1. 业务代码 数据表结构 dao package com.lovely.dao.impl;import com.lovely.dao.AccountDao; import org.springframework.jdbc.core.JdbcTemplate;/*** author echo lovely* date 2020/8/9 11:01*/ public class AccountD…

八、计数排序及其应用分析

1 本节思路 之前的算法的最基本的思想是比较元素大小,所以算法复杂度最好是Θ(nlogn)\Theta(nlogn)Θ(nlogn),本节不再基于元素比较,而是基于计数的Counting sort,然后应用在Radix sort上。 2 Counting sort 2.1 算法思想 Cou…

Google开发者模式调试css样式的方法

界面如下,你需要调试css样式… 看下图,高仿某云播放界面部分 需求 1.h5开发手机端界面,禁用缩放 2.如何精准的定位像上图一样,或者更好 3.使用Google调试器,调试css样式如何调样式 选择对应的样式 确定多个元素…

OD汇编需要标签

如何解决,看那红体字。。。 push 0046ad70 标签就是地址的引用 zai破解的道路上面面前行 技术参考:http://zhidao.baidu.com/link?url8JP8KFxTinclhl6MwpaZw5buhtv1p4zgpjy8rKkBPvD4YqCq2uudXQZrhuBLPGZm5ahe3d7YsLb3MeAFDXfsua转载于:https://www.cnbl…

git与github使用

1 从github上clone到本地 配置Git 首先在本地创建ssh key; $ ssh-keygen -t rsa -C "your_emailyouremail.com"后面的your_emailyouremail.com改为你在github上注册的邮箱,之后会要求确认路径和输入密码,我们这使用默认的一路回车…

bootstrap panel 布局

panel1. 效果2. 基于bootstrap实现用于页面分专栏展示 1. 效果 成品 2. 基于bootstrap实现 <!DOCTYPE html> <html><head><meta charset"UTF-8"><title>panel 布局</title><link rel"stylesheet" href"cs…