算法分析与设计实验报告一
时间:2026-01-20
时间:2026-01-20
算法分析与设计
华中科技大学 算法分析与设计实验报告
学生姓名:庞 亮 系别:软件学院 专业与班号:软件工程0805 学号:U200818042
实验时间:第 二 周,星期三 ,晚上 实验房间号:软件学院五楼机房
[实验名称]Strassen’s 矩阵乘法和最近点对算法
[实验目的]
1、理解“分治法”算法设计思想及其实现步骤
2、掌握分治算法效率递归分析方法
3、掌握主方式求解递归式方法
[实验条件]
硬件:计算机
软件:计算机程序语言开发平台,如C、C++、Java、Matlab。
学生:至少掌握一门计算机程序设计语言,如C、C++、Java、Matlab。
[实验内容及要求]
1、利用计算机程序设计语言,实现教材第28.2 章介绍的“Strassen’s 矩阵乘法算法”,自主生成两个8×8 的矩阵,检验算法的正确性并输出算法结果。
2、比较 Strassen’s 矩阵乘法算法和数学定义的矩阵乘法算法效率之间的区别,并用直观的表达方式把两种不同矩阵乘法的效率随矩阵维数的变化趋势。
3、利用计算机程序设计语言,实现教材第33.4 章介绍的“最近点对算法”,在拟定的二维空间点集上检验算法的正确性并输出算法结果。
[实验原理]
1. Strassen’s矩阵乘法简介
Strassen’s算法是将矩阵分成了如图所示的均等的四块。分后的每一块儿任然还是方阵。所以可以由大问题分解成若干子问题进行解决。为了能使子问题能够返回到原始问题。
Strassen‘s算法提出了如下的计算公
式,可以用矩阵的子矩阵计算出S1-S7,然后又由S1-S7合成原始矩阵。而S1-S7的计算又是方阵的乘法。由此使用分治算法便可以解决问题。
算法分析与设计
2. 最近点对问题(Closest Pair Problems)算法简介
首先这个问题也是采用了分治的思想,将空间内的距离分成三类,分界线左边的点之间的距离,分界线右边的点之间的距离,还有分界线两边距离为D的区域内的两点间距离。
[算法具体代码]
1.矩阵相乘问题
// Strassen.cpp : 定义控制台应用程序的入口点。
//
//******************************************************************************** #include "stdafx.h"
#include "stdlib.h"
#define AM Copy(A,0,0,A.v/2)
#define BM Copy(A,A.v/2,0,A.v/2)
#define CM Copy(A,0,A.v/2,A.v/2)
#define DM Copy(A,A.v/2,A.v/2,A.v/2)
#define EM Copy(B,0,0,B.v/2)
#define FM Copy(B,B.v/2,0,B.v/2)
#define GM Copy(B,0,B.v/2,B.v/2)
#define HM Copy(B,B.v/2,B.v/2,B.v/2)
#define V 2
//******************************************************************************** //矩阵结构
typedef struct matrix
{
int v; int x[16][16]; }Matrix;
算法分析与设计
//******************************************************************************** //输入输出文件
FILE *fout;
FILE *fin;
//******************************************************************************** //矩阵打印(文件)
void fPrint(Matrix A)
{
}
//******************************************************************************** //矩阵打印(屏幕)
void Print(Matrix A)
{
}
//******************************************************************************** //矩阵截取
Matrix Copy(Matrix X,int x,int y,int v)
{
Matrix temp; temp.v=v; for(int i=x;i<x+v;i++) { for(int j=y;j<y+v;j++) { for(int j=0;j<A.v;j++) { } for(int i=0;i<A.v;i++) { } printf("\n"); printf("%d ",A.x[i][j]); for(int j=0;j<A.v;j++) { } for(int i=0;i<A.v;i++) { } fprintf(fout,"\n"); fprintf(fout,"%d ",A.x[i][j]);
算法分析与设计
}
} } temp.x[i-x][j-y]=X.x[i][j]; return temp;
//******************************************************************************** //矩阵相减
Matrix Minus(Matrix A,Matrix B)
{
}
//******************************************************************************** //矩阵相加
Matrix Plus(Matrix A,Matrix B)
{
}
//A: Copy(A,0,0,A.v/2)
//B: Copy(A,A.v/2,0,A.v/2)
//C: Copy(A,0,A.v/2,A.v/2)
//D: Copy(A,A.v/2,A.v/2,A.v/2);
//E: Copy(B,0,0,B.v/2) Matrix temp; temp.v=A.v; for(int j=0;j<A.v;j++) { } return temp; for(int i=0;i<A.v;i++) { } temp.x[i][j]=A.x[i][j]+B.x[i][j]; Matrix temp; temp.v=A.v; for(int j=0;j<A.v;j++) { } return temp; for(int i=0;i<A.v;i++) { } temp.x[i][j]=A.x[i][j]-B.x[i][j];
算法分析与设计
//F: Copy(B,B.v/2,0,B.v/2)
//G: Copy(B,0,B.v/2,B.v/2)
//H: Copy(B,B.v/2,B.v/2,B.v/2);
//******************************************************************************** //矩阵合并
Matrix Merge4(Matrix A,Matrix B,Matrix C,Matrix D)
{
}
//******************************************************************************** //矩阵相乘
Matrix Mutiply(Matrix A,Matrix B)
{ Matrix temp; temp.v=A.v*2; for(int i=0;i<A.v;i++) { } for(int i=0;i<B.v;i++) { } for(int i=0;i<C.v;i++) { } for(int i=0;i<D.v;i++) { } return temp; for(int j=0;j<D.v;j++) { } temp.x[i+D.v][j+D.v]=D.x[i][j]; for(int j=0;j<C.v;j++) { } temp.x[i][j+C.v]=C.x[i][j]; for(int j=0;j<B.v;j++) { } temp.x[i+B.v][j]=B.x[i][j]; for(int j=0;j<A.v;j++) { } temp.x[i][j]=A.x[i][j];
算法分析与设计
上一篇:从社会工作学习和实践中的收获
下一篇:中国银行产品供应链融资产品