算法导论(第三版)Exercises4.2(第四章二节)
4.2-1(计算结果)
18 14
62 66
4.2-2(Strassen算法计算矩阵乘法)
void multiplyMatrix(int a[], int b[], int n, int result[])
{
int i, j, dim=n/;
int n1=(n/) * (n/);
int a11[n1], a12[n1], a21[n1], a22[n1];
int b11[n1], b12[n1], b21[n1], b22[n1]; int s1[n1], s2[n1], s3[n1], s4[n1], s5[n1];
int s6[n1], s7[n1], s8[n1], s9[n1], s10[n1]; int p1[n1], p2[n1], p3[n1], p4[n1];
int p5[n1], p6[n1], p7[n1]; int c11[n1], c12[n1], c21[n1], c22[n1]; if(n == )
{
result[] = a[] * b[];
return;
}
if(n% != )
{
printf("wrong array!\n");
return;
} divideMatrix(a, n, a11, a12, a21, a22);
divideMatrix(b, n, b11, b12, b21, b22);
subtractMatrix(b12, b22, dim, s1);
addMatrix(a11, a12, dim, s2);
addMatrix(a21, a22, dim, s3);
subtractMatrix(b21, b11, dim, s4);
addMatrix(a11, a22, dim, s5);
addMatrix(b11, b22, dim, s6);
subtractMatrix(a12, a22, dim, s7);
addMatrix(b21, b22, dim, s8);
subtractMatrix(a11, a21, dim, s9);
addMatrix(b11, b12, dim, s10); multiplyMatrix(a11, s1, dim, p1);
multiplyMatrix(s2, b22, dim, p2);
multiplyMatrix(s3, b11, dim, p3);
multiplyMatrix(a22, s4, dim, p4);
multiplyMatrix(s5, s6, dim, p5);
multiplyMatrix(s7, s8, dim, p6);
multiplyMatrix(s9, s10, dim, p7); addMatrix(p5, p4, dim, c11);
subtractMatrix(c11, p2, dim, c11);
addMatrix(c11, p6, dim, c11);
addMatrix(p1, p2, dim, c12);
addMatrix(p3, p4, dim, c21);
addMatrix(p5, p1, dim, c22);
subtractMatrix(c22, p3, dim, c22);
subtractMatrix(c22, p7, dim, c22); combineMatrix(c11, c12, c21, c22, dim, result);
} void addMatrix(int a[], int b[], int n, int result[])
{
int i;
for(i=; i<n*n; i++) result[i] = a[i] + b[i];
} void subtractMatrix(int a[], int b[], int n, int result[])
{
int i;
for(i=; i<n*n; i++) result[i] = a[i] - b[i];
} void divideMatrix(int a[], int n, int a11[], int a12[], int a21[], int a22[])
{
int i, mid, j, k, h;
mid = n / ;
for(i=; i<mid; i++)
{
for(j=; j<mid; j++)
{
h = i * mid + j;
k = i * n + j;
a11[h] = a[k];
a12[h] = a[k+mid];
a21[h] = a[k+n*n/];
a22[h] = a[k+n*n/+mid];
}
}
} void combineMatrix(int a11[], int a12[], int a21[], int a22[], int n, int result[])
{
int i, j, h, k, dim, mid;
mid = n;
dim = mid * ;
for(i=; i<mid; i++)
{
for(j=; j<mid; j++)
{
h = i * mid + j;
k = i * dim + j;
result[k] = a11[h];
result[k+mid] = a12[h];
result[k+n*n*] = a21[h];
result[k+n*n*+mid] = a22[h];
}
}
}
4.2-3
当矩阵的n不是2的指数时,添加0补足,即可按上述算法运行
4.2-4
21
4.2-5
72x72的那个最佳,比Strassen算法好
4.2-6
当knXn矩阵时,按4.2-3的方法处理,同样nXkn也一样,可以看出nXkn计算时间短
4.2-7(用数组存储复数)
void multiplyComplex(double c1[], double c2[], double result[])
{
double p1, p2, p3;
p1 = c1[] + c1[];
p2 = c2[] + c2[];
p1 = p1 * p2;
p2 = c1[] * c2[];
p3 = c1[] * c2[];
result[] = p2 - p3;
result[] = p1 - p2 - p3;
}
算法导论(第三版)Exercises4.2(第四章二节)的更多相关文章
- 算法导论(第三版)Exercises2.3(归并排序、二分查找、计算集合中是否有和为X的2个元素)
2.3-1: 3 9 26 38 41 49 52 59 3 26 41 52 9 38 49 57 3 41 52 26 38 57 9 49 3 41 52 26 38 ...
- 算法导论(第三版)Problems2(归并插入排序、数列逆序计算)
讨论内容不说明,仅提供相应的程序. 2.1:归并插入排序θ(nlgn) void mergeInsertionSort(int a[], int l, int r, int k) { int m; & ...
- 算法导论(第三版)Exercises2.1(插入排序、线性查找、N位大数相加)
关于练习程序的说明参见置顶的那篇. 2.1-1: 31 41 59 26 41 58 31 41 59 26 41 58 31 41 59 26 41 58 26 31 41 59 41 58 26 ...
- 《CSS权威指南(第三版)》---第四章 值和单位
本章主要讲解的是一些属性声明用的值: CSS中的值主要有数字,百分数,颜色, 1.颜色: rgb(100%,100%,100%) OR rgb(255,255,255) OR #FF0000 WE ...
- 第三周学习java第四章学习总结及体会!
第三周java 2第四章的学习总结: 一.主要内容(类与对象): 1.类: 2.构造方法与对象的创建: 3.类与程序的基本结构: 4.参数传值: 5.对象的组合: 6.实例成员与类成员: 7.方法重载 ...
- 《C++Primer》第五版习题解答--第四章【学习笔记】
[C++Primer]第五版习题解答--第四章[学习笔记] ps:答案是个人在学习过程中书写,可能存在错漏之处,仅作参考. 作者:cosefy Date: 2020/1/11 第四章:表达式 练习4. ...
- 算法导论 第三章 and 第四章
第三章 渐进的基本O().... 常用函数 % 和 // 转换 斯特林近似公式 斐波那契数 第四章 分治策略:分解(递归)--解决(递归触底)--合并 求解递归式的3种方法: 1:代入法(替代法): ...
- Windows程序设计(第五版)学习:第四章 文本输出
第四章 文本输出 1,客户区:整个应用程序窗口中没有被标题栏.边框.菜单栏.工具栏.状态栏和滚动条占用的区域.简而言之,客户区就是窗口中程序可以在上面绘制并向用户传达可视化信息的区域. 2,大多数 ...
- JavaScript高级程序设计第三版-读书笔记(1-3章)
这是我第一次用markdown,也是我第一次在网上记录我自己的学习过程. 第一章 JavaScript主要由以下三个不同的部分构成 ECMAScript 提供核心语言功能 DOM 提供访问 ...
随机推荐
- Codeforces 385C Bear and Prime Numbers
题目链接:Codeforces 385C Bear and Prime Numbers 这题告诉我仅仅有询问没有更新通常是不用线段树的.或者说还有比线段树更简单的方法. 用一个sum数组记录前n项和, ...
- resin4 简单学习
1.Resin 4.0.26 Resin是CAUCHO公司的产品,是一个非常流行的application server,对servlet和JSP提供了良好的支持,性能也比较优良,resin自身采用JA ...
- OpenSuse如何共享目录
如何在SUSE Linux 建立共享文件夹 1./etc/samba/smb.conf 打开配置文档 2.在文档的最后加上共享的文档夹/opt,下面是示例. nte143:/etc/samba # v ...
- hibernate连接数据库,进行操作的步骤
//初始化 Configuration conf=null; SessionFactory sf=null; Session session=null; Transaction tx=null; tr ...
- div与span
div与span的区别: div标签属于块级元素,span标签属于行内元素,使用对比效果如下: <!DOCTYPE html> <html> <head lang=&qu ...
- C/C++中new关键字是否加括号的区别
代码: #include <iostream> using namespace std; class A{ public: int a; }; int main(){ A *a1 = ne ...
- Mysql 储存过程以及 python callproc调用
一.存储过程(stored procedure) 存储过程将存入的一系列SQL语句进行预编译,执行并存放在数据库中,之后如果需要使用sql语句对这一组sql进行访问时可以直接提取(很好理解 存储过程就 ...
- 前端技术-svg简介与snap.svg.js开源项目的使用
前言-为什么学习snap.svg.js 前阵子webAPP的技术群里有人感觉到svg+animate的形式感觉很炫,矢量图任意放大且不需要下载图片,并且在手机端效果流畅. (矢量图与位图最大的区别是, ...
- dedecms文章的更新时间问题 每次更改文章时间变成最新的
dedecms 每次更改文章,更新时间这里每次改了后再来看又变成当前最新时间的了. 解决方法: 查找后台目录的 templets/article_edit.htm 这个文件. 然后打开,查找如下代码: ...
- 编译protobuf-2.5.0中的错误处理
最近在编译protobuf-2.5.0源码的时候发现的错误已经应对方法 1. 在源码目录执行 ./configure 命令的时候,发生如下错误 error: C++ preprocessor &quo ...