实验4:递归与分治策略的应用.docVIP

  1. 1、本文档共16页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 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 -

文档评论(0)

153****0212 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档