- 1、本文档共16页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
实验4:递归与分治策略的应用
实验4:递归与分治策略的应用
PAGE
实验4:递归与分治策略的应用
课程实验报告
课程名称
算法分析与设计
班级
实验日期
姓名
学号
实验成绩
实验名称
实验4:递归与分治策略的应用
实
验
目
的
及
要
求
1.掌握分治策略的基本步骤;
2.掌握分治策略的思想。
实
验
环
境
操作系统:Windows
IDE:Visual C++
实
验
内
容
(1)排序算法
分别实现归并排序、快速排序和堆排序,输入规模N=64,128,256,512,…(N取至单次排序运行时间不超过3分钟),输入数据随机生成1-10000之间的整数,记录实验结果,做出运行时间与输入规模之间的关系曲线图,说明算法的时间复杂度和空间复杂度,根据曲线图比较3种排序算法的优劣。
(2)矩阵乘法
调研Strassen矩阵乘算法,随机生成N*N的矩阵,矩阵中的每个数字为1-100之间的整数,N=4,8,16…(N取至单次矩阵乘时间不超过3分钟),分别用Strassen算法和你能想到的其它方法(例如直接计算)实现矩阵乘运算,做出运行时间与输入规模之间的关系曲线图,并简要分析Strassen算法和你所实现的方法的时间复杂度。
调
试
过
程
及
实
验
结
果
运行时截图:
并归排序:
运行到一定规模:
快速排序:
运行到一定规模:
堆排序:
运行到一定规模:
矩阵乘法:
1朴素算法:
2Strassen矩阵乘算法
一定规模后:
总
结
横坐标计算规模:1:8129 2:65536 3:131072 4:262144 5:1048576
随着输入规模的增大,通过三种算法的时间记录做成折线图观察不难发现,在初期,三种算法所用时间几乎相等,随着输入规模的不断增大,堆排序和快速排序仍然能够保持相对较小的增长,而并归排序所用时间复杂度开始大幅度增加。
快速排序果然是快,数据越大优势越明显,并且实现上也较为简单。理论上它的平均时间和归并排序,堆排序都是一样的(在最坏情况还还不如它们),都是O(nlog2n),但实际运行来看比它们两者的速度都快一倍以上。COOL!
合并排序需要额外相同规模的数组,空间复杂度为O(n)。从具体实现来看,这只是一种理论上的优秀算法,想法比较简单直接,但实现上比quicksort?复杂,运行时间也差,在数据很大的时候运行时间是heapsort的两倍,更不用说quicksort了。
堆排序利用了二分树的结构,将时间复杂度降到O(nlog2n),理论上和实现上表现都不错,并且发现在数据量是10?000?000时,甚至优于快排,可能是运行时数据的问题。
对于strassen 算法对其时间复杂度分析:T(n)=7T(n/2)+O(n);而朴素算法的时间复杂度为n的三次方。
随着数据增大,也出现乘方级别的时间复杂度差距。
附
录
//头文件
#includeiostream
#include
#include
#include
#include
#define PARENT(i) (i/2) //几个较简单函数
#define LEFT(i) (2*i+1)
#define RIGHT(i) (2*i+2)
using namespace std;
//定义所需要变量等
#define MAX 100000
int a[MAX]; //数组存储原始顺序
int temp[MAX]; //临时数组存储临时排序值
int num; //计算统计逆序对数
int N = 2; //数据规模
clock_t begintimes, endtimes; //clock_t为clock()函数返回的变量类型
double duration; //运行时间计算
int heapsize; //堆长度
//随机生成数函数
int number(){
int a;
a = rand() % 10000 + 1; //随机生成1到一万之间的整数
return a;
}
//初始化函数 对数组a[]初始化。
void init(){
memset(temp,0, MAX * sizeof(int)); //临时数组清零
for (int i = 0; i N; i++){ //新数组赋值
a[i] = number();
}
return;
}
//单次并归挑选
void Merge(int left, int mid, int right) //需要三个参数,将原来数组分割
{
int i = left, j = mid + 1, n = 0, length = right -
您可能关注的文档
最近下载
- 济南版(2024)初中生物学七年级上册《脊椎动物身体背部有脊柱》教学设计及反思.docx
- 中铁建工集团质量管理手册.pdf
- 二级中医医院评审细则解读院感部分.pptx
- 2024年迪瑞医疗分析报告:强化协同,仪器放量布局市场.pdf
- 部编版初中道德与法治九年级上册单元作业设计 (优质案例12页) .pdf
- 广东实验中学2023-2024学年八年级上学期期中考试语文试卷.docx VIP
- 2020年世界发展报告:全球价值链时代的贸易换发展.pdf VIP
- 湖北省水利工程重大设计变更报告编制大纲.pdf
- 2024高中地理教师课程标准考试模拟试卷及参考答案.docx VIP
- 《材料成型工艺学》全套教学课件.ppt
文档评论(0)