矩阵乘法

常见算法的时间空间复杂度【整理摘编】

。_饼干妹妹 提交于 2019-12-04 00:59:20
1.( 来源 ) (1)O(1):常量阶,运行时间为常量 (2)O(logn):对数阶,如 二分搜索算法,快速幂 (3)O(n):线性阶,如 n个数内找最大值 (4)O(nlogn):对数阶,如 快速排序算法,线段树 (5)O(n^2):平方阶,如 选择排序,冒泡排序 (6)O(n^3):立方阶,如 两个n阶矩阵的乘法运算 (7)O(2^n):指数阶,如 n个元素集合的所有子集的算法 (8)O(n!):阶乘阶,如 n个元素全部排列的算法 2.( 来源) 来源: https://www.cnblogs.com/phemiku/p/11826243.html

矩阵运算 [转]

两盒软妹~` 提交于 2019-12-03 20:08:51
原文地址: https://www.cnblogs.com/hanruyun/p/9620029.html 作者:子谦。 -------------------------------------------------------------------------------------------------------------------------------------------------------- 嗯,这玩意看着很难对吧,之前我还是这样想的。。直到看到了 斐波那契公约数 这道题 这道题一看我这种辣鸡就不会做啊,然后rqy告诉我这是傻逼题啊,我忽然就想起了以前听说过的矩阵乘。。然后懒惰的DDOSvoid大佬告诉我要做这道题,得先做 斐波那契数列 ,要做斐波那契数列,得先做 矩阵加速 ,要做矩阵加速,得先做 矩阵快速幂 。。于是,一个上午就这么过去了 回归正题 定义 什么是矩阵运算呢? 在理解这个问题前,我们先要知道什么是矩阵 百度百科给的定义如下 矩阵是一个按照长方阵列排列的复数或实数集合 复数实数什么的我们先不管,总之,矩阵就是一堆数,按照矩形排列形成的集合 那么,我们所需要记录的也就是它的长、宽以及矩阵中存储的元素 特殊的,长宽相等的矩阵我们定义它为方阵 当两个矩阵的长宽相等时,我们认为这两个矩阵为同型矩形 若矩阵为方阵,且对角线上的元素为1,其余均为0

Codeforces 575A. Fibonotci 矩阵乘法+线段树

做~自己de王妃 提交于 2019-12-03 13:29:51
题解: 这道题……看完题就大概知道怎么做,但是考试时没有实现出来。 考试的时候想的是用倍增来实现,但是细节太多写不出来,正解是用线段树来维护连续n个矩阵的乘积,其实这个做法也挺显然的,但是没有把这两个东西放在一起用过。然后细节还是很多,调了一下午。 代码: #include<bits/stdc++.h> using namespace std ; #define LL long long #define pa pair<int,int> const int Maxn= 50010 ; const int inf= 2147483647 ; LL read() { LL x= 0 ,f= 1 ; char ch=getchar(); while (ch< '0' ||ch> '9' ){ if (ch== '-' )f=- 1 ;ch=getchar();} while (ch>= '0' &&ch<= '9' )x=(x<< 3 )+(x<< 1 )+(ch^ 48 ),ch=getchar(); return x*f; } struct Node{LL pos,bel; int v;}a[Maxn]; bool cmp(Node a,Node b){ return a.pos<b.pos;} LL K,belK; int P,n,m,s[Maxn],F[Maxn]; struct

Codeforces719E 矩阵乘法+线段树

二次信任 提交于 2019-12-03 13:23:10
Codeforces 719E 矩阵乘法+线段树 题目大意: 给定一个数列,请完成下面的两种操作 1.1 1 r z [ l , r ] //--> 区间加上一个数 z //--> 2.2 l r 查询 [ l , r ] //--> 区间内所有的数字,对应在 f i b //--> 中的值 例如 序列 1 3 2 4 5 ,2 2 3的结果就是 f i b ( 2 ) + f i b ( 2 ) + f i b ( 3 ) = 4 //--> 区间的加法我们很容易想到线段树,但是这时求得已经不是原区间的和了,而是在 f i b //--> 数列中对应项的和,我们考虑转化 首先,正常求 f i b //--> 数列的第 k //--> 项,我们可以利用矩阵乘法快速求出,大概是 ( f i b ( i − 2 ) f i b ( i − 1 ) ) ∗ ( 1 1 1 0 ) = ( f i b ( i − 1 ) f i b ( i ) ) //--> 由于矩阵乘法具有结合律,将中间的矩阵快速幂再乘上第一个矩阵可以得到最后想要的 f i b ( i ) //--> ,在这道题目中,我们其实还用到了另外一个性质:矩阵乘法在合法的情况下具有分配率,即 E ∗ ( A + B ) = E ∗ A + E ∗ B //--> 且 ( A + B ) ∗ E = A ∗ E + B ∗ E

线段树+矩阵快速幂 codeforces718C Sasha and Array

放肆的年华 提交于 2019-12-03 13:22:54
传送门: 点击打开链接 题意:操作1,区间[l,r]的数字+x 操作2,求sigma f(i),l<=i<=r,f是斐波那契数列。 答案取模1e9+7 首先斐波那契数列用矩阵快速幂求,谁都会的。 这里有一个矩阵乘法的性质,A*B+A*C=A*(B+C) 有了这个性质,这题就非常傻逼了。 在求斐波那契数列中,是A*F,A是变换矩阵,F是列矩阵 那么我们用线段树的懒惰标记维护A矩阵,然后用sum维护F矩阵 之后在线段树上,就变成了区间更新乘以x。 就是一个很简单的手速题了。 #include <map> #include <set> #include <cmath> #include <ctime> #include <stack> #include <queue> #include <cstdio> #include <cctype> #include <bitset> #include <string> #include <vector> #include <cstring> #include <iostream> #include <algorithm> #include <functional> #define fuck(x) cout<<"["<<x<<"]"; #define FIN freopen("input.txt","r",stdin); #define FOUT

python numpy学习

若如初见. 提交于 2019-12-03 12:04:42
以下代码来源于本博文作者观看 大神视频 并纯手敲。 目录 numpy的属性 创建array numpy的运算1 随机数生成以及矩阵的运算2 numpy的索引 array合并 array分割 numpy的浅拷贝和深拷贝 numpy的属性 import numpy as np array = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]]) print(array) print(array.ndim) # 维度 2 print(array.shape) # 形状 (3, 3) print(array.size) # 大小 9 print(array.dtype) # 元素类型 int32 numpy创建array import numpy as np a = np.array([1, 2, 3], dtype=np.int32) print(a.dtype) # int32 b = np.array([1, 2, 3], dtype=np.float) print(b.dtype) # float64 c = np.array([1, 2, 3]) d = np.array([[1, 2, 3], [4, 5, 6]]) print(d) # 二维矩阵 zero = np.zeros((2, 3)) print(zero) #

1. 矩阵连乘问题

不羁的心 提交于 2019-12-03 08:03:24
(1) 矩阵链连乘问题: 给定n个矩阵{A 1 ,A 2 ,...,A n },其中A i 与A i+1 是可乘 的,i=1,2...,n-1。如何确定计算矩阵连乘积的计算次序,使得依此次序 计算矩阵连乘积需要的数乘次数最少。 输入数据:共m+1行;第一行为测试数据的组数m;以后每行n+1个正 整数,表示n个矩阵的行列值。 输出:最少次数及连乘的计算次序。 样例输入: 1 5 10 4 6 10 2 样例输出: 348 (A1(A2(A3(A4A5)))) 思路:   1.最优子结构:将A i A i+1 ...A j 记为 A[ i : j ]。计算 A[ 1 : n ]的最优计算序列,设这个计算次序在矩阵A k (1<= k <= n)和 A k+1 之间把矩阵连乘断开,其相应的加括号的方式为( ( A 1 +...+A k ) ( A k+1 +...+A n ) )。它的子链也是最优的(反证法)。   Count(A[1:n]) = Count(A[1:k])+ Count(A[k+1:n])+ Count(A[1:k] * A[k+1:n])   2.递推关系式:   记对于A[ i : j ] 所需的最少乘法次数为m[ i ][ j ]。   m[ i ][ j ] = 0 (i == j)   m[ i ][ j ] = min { m[ i ][ k ] + m[

矩阵

冷暖自知 提交于 2019-12-03 01:35:42
矩阵 矩阵运算 加法 数乘 乘法 转置 特殊矩阵 对角阵 单位阵 数量阵 上下三角阵 对称阵 反对称阵 正交阵 初等矩阵 行阶梯矩阵 行最简矩阵 伴随矩阵 矩阵 逆矩阵 转置 数乘 行列式 秩 可逆矩阵 求逆矩阵的方法 通过伴随矩阵(行列式好求时) 初等变化(行列式不好求时) 初等变换 初等矩阵 等价 矩阵的秩 子式 公式 分块矩阵 运算 来源: https://www.cnblogs.com/vergilwu/p/11769432.html

R语言函数总结

匿名 (未验证) 提交于 2019-12-03 00:32:02
R语言与 数据挖掘:公式;数据;方法 R语言特征 对大小写敏感 通常,数字,字母,. 和 _都是允许的(在一些国家还包括重音字母)。不过,一个命名必须以 . 或者字母开头,并且如果以 . 开头,第二个字符不允许是数字。 基本命令要么是表达式(expressions)要么就是 赋值(assignments)。 命令可以被 (;)隔开,或者另起一行。 基本命令可以通过大括弧({和}) 放在一起构成一个复合表达式(compound expression)。 一行中,从井号(#)开始到句子收尾之间的语句就是是注释。 R是动态类型、强类型的语言。 R的基本数据类型有数值型(numeric)、字符型(character)、复数型(complex)和逻辑型(logical),对象类型有向量、因子、数组、矩阵、数据框、列表、时间序列。 基础指令 程序辅助性操作: 运行 q()――退出R程序 tab――自动补全 ctrl+L――清空console ESC――中断当前计算 调试查错 browser() 和 debug()―― 设置断点进行,运行到此可以进行浏览查看(具体调试看browser()帮助文档(c,n,Q)) stop('your message here.')――输入参数不正确时,停止程序执行 cat()――查看变量? 帮助 help(solve) 和 ?solve 等同 ??solve―

编写矩阵乘法算法程序.设A = [[2,1],[3,5],[1,4]],B = [[3,2,1,4],[0,7,2,6]],求C=A*B.

匿名 (未验证) 提交于 2019-12-03 00:30:01
a = [ [2,1], [3,5], [1,4] ] b = [ [3,2,1,4], [0,7,2,6] ] #定义一个数组c用来接收数组a和数组b相乘的结果 #[0 for i in range(4)]表示数组c的列数 # for i in range(3) 表示数组c的行数 c = [[0 for i in range(4)] for i inrange(3)] for i in range(len(a)):#取数组a的行数 for j in range(len(b[0])):#取数组b的列数 t = 0 for k in range(len(b)):#控制数组a中的数和数组b中的哪一个数相乘 t+=a[i][k] * b[k][j] c[i][j]=t#将结果赋值给数组c print(c) 文章来源: 编写矩阵乘法算法程序.设A = [[2,1],[3,5],[1,4]],B = [[3,2,1,4],[0,7,2,6]],求C=A*B.