版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2023年算法实验报告分治法性能分析2023年算法实验报告分治法性能分析古小费2011-3-29本次是第一次算法作业,该部分内容包含3个题目的程序代码,分析文档,说明图片等内容
目录TOC\o"1-3"\h\z\uHYPERLINK\l"_Toc289198677"引言 PAGEREF_Toc289198677\h3HYPERLINK\l"_Toc289198678"1算法性能比较ﻩPAGEREF_Toc289198678\h3HYPERLINK1.1问题分析ﻩPAGEREF_Toc289198679\h3HYPERLINK\l"_Toc289198680"1.2源程序代码 PAGEREF_Toc289198680\h3HYPERLINK\l"_Toc289198681"1.3运行示例 PAGEREF_Toc289198681\h8HYPERLINK\l"_Toc289198682"1.4数据分析ﻩPAGEREF_Toc289198682\h8HYPERLINK\l"_Toc289198683"(单次录入数据具有较大随机误差,只看增长趋势)ﻩPAGEREF_Toc289198683\h8HYPERLINK\l"_Toc289198684"2循环赛问题 PAGEREF_Toc289198684\h9HYPERLINK\l"_Toc289198685"2.1问题描述 PAGEREF_Toc289198685\h9HYPERLINK\l"_Toc289198686"2.2问题分析 PAGEREF_Toc289198686\h9HYPERLINK2.3源程序 87\h102.4运行示例 PAGEREF_Toc289198688\h11HYPERLINK3最大最小值问题ﻩ198689\h12HYPERLINK\l"_Toc289198690"3.1问题描述与分析ﻩPAGEREF_Toc289198690\h12HYPERLINK3.2源程序ﻩPAGEREF_Toc289198691\h13HYPERLINK3.3运行示例 PAGEREF_Toc289198692\h14引言任何一个可以用计算机求解的问题所需的计算时间都与其规模有关。问题的规模越小,越容易直接求解,解题所需的计算时间也越少。分治法是计算机科学中经常使用的一种算法。设计思想是,将一个难以直接解决的大问题,分割成一些规模较小的相同问题,以便各个击破,分而治之。但是不是所有问题都适合用分治法解决。当求解一个输入规模为n且取值又相称大的问题时,使用蛮力策略效率一般得不到保证。因此分治策略将问题划提成k个子问题分别求解合并能有效提高计算效率。1算法性能比较1.1问题分析比较插入排序,合并排序和快速排序性能。算法性能比较通常是从时间复杂度的角度进行的。排序算法的复杂度重要和算法中的比较次数和元素互换或移动次数有关。因而在不同大小规模的问题中通过记录这两者之和来评判算法的优劣。同时也可以证明各种算法的时间复杂度与问题规模n之间的关系。特别说明:本程序中考虑到不同规模的乱序数据输入过程比较复杂,编写了一个规模n的整型数据随机排列函数,可以直接生成指定大小的1-n无序整数列。1.2源程序代码//2023年3月19日0:20:02//maintest.cppfortest#include<iostream>#include<time.h>usingnamespacestd;//全局标记比较次数和移动次数intcount_compare=0;intcount_move=0;intcount_all(){returncount_compare+count_move;}voidclear_count(){count_compare=0;count_move=0;}//insertsortvoidinsert_element(inta[],intsize,intelement)//sizebeforeinsertion{inti=0;for(i=size-1;i>=0;i--){count_compare++;if(element<a[i]){a[i+1]=a[i];count_move++;}elsebreak;}a[i+1]=element;count_move++;}voidInsertSort(inta[],intsize){for(inti=1;i<size;i++){insert_element(a,i,a[i]);}}//mergesortvoidMerge(intc[],intd[],intl,intm,intr){inti=l,j=m+1,k=l;while(i<=m&&j<=r){count_compare++;if(c[i]<=c[j]){d[k++]=c[i++];count_move++;}else{d[k++]=c[j++];count_move++;}}count_compare++;if(i>m){for(intq=j;q<=r;q++){d[k++]=c[q];count_move++;}}elsefor(intq=i;q<=m;q++){d[k++]=c[q];count_move++;}}voidCopy(inta[],intb[],intl,intr){for(inti=l;i<=r;i++){a[i]=b[i];count_move++;}}voidMergeSort(inta[],intleft,intright,intsize){if(left<right){count_compare++;inti=(right+left)/2;intp=size;//thisisimportant,mindthevalue!int*b=newint[p];MergeSort(a,left,i,size);MergeSort(a,i+1,right,size);Merge(a,b,left,i,right);Copy(a,b,left,right);}}//quicksortvoidswap(inta[],inti,intj){inttemp=a[i];a[i]=a[j];a[j]=temp;count_move+=3;}intpartition(inta[],intp,intr){inti=p,j=r+1;intx=a[p];while(true){while(a[++i]<x&&i<r)count_compare++;while(a[--j]>x)count_compare++;count_compare++;if(i>=j)break;swap(a,i,j);}a[p]=a[j];a[j]=x;count_move++;returnj;}voidQuickSort(inta[],intp,intr){if(p<r){intq=partition(a,p,r);QuickSort(a,p,q-1);QuickSort(a,q+1,r);}count_compare++;}//showvoidshow_array(inta[],intsize)//显示一个数组的所有元素{for(inti=0;i<size;i++){cout<<a[i]<<"";}cout<<endl;}//randomarrayvoidRandomArray(inta[],intsize)//随机生成数组含n个元素,其元素各不相同{srand(time(NULL));for(inti=0;i<size;i++)a[i]=0;for(inti=1;i<=size;i++){intp=rand()%size;while(a[p]!=0){p=(++p)%size;}a[p]=i;}show_array(a,size);}//copyarrayvoidCopyArray(inta[],intb[],intsize){for(inti=0;i<size;i++)b[i]=a[i];}intmain(){int*a;int*temp_a;intsize=4;cin>>size;a=newint[size];temp_a=newint[size];RandomArray(temp_a,size);CopyArray(temp_a,a,size);show_array(a,size);InsertSort(a,size);show_array(a,size);cout<<"插入排序比较次数为"<<count_compare<<endl;cout<<"插入排序移动次数为"<<count_move<<endl;cout<<"总规模为"<<count_all()<<endl;clear_count();CopyArray(temp_a,a,size);show_array(a,size);MergeSort(a,0,size-1,size);show_array(a,size);cout<<"合并排序比较次数为"<<count_compare<<endl;cout<<"合并排序移动次数为"<<count_move<<endl;cout<<"总规模为"<<count_all()<<endl;clear_count();CopyArray(temp_a,a,size);show_array(a,size);QuickSort(a,0,size-1);show_array(a,size);cout<<"快速排序比较次数为"<<count_compare<<endl;cout<<"快速排序移动次数为"<<count_move<<endl;cout<<"总规模为"<<count_all()<<endl;show_array(a,size);system("pause");return0;}}1.3运营示例1.4数据分析(单次录入数据具有较大随机误差,只看增长趋势)问题规模(n)排序总复杂度规模(T(n))插入排序合并排序快速排序10571055020221280122303674612384094666037150139487943280326115708561004694206410642002291247182447500130133136687368100050425430309170031000043898103401968225489根据列表分析,插入算法平均复杂度为Ο(n2),合并算法平均复杂度为Ο(nlogn),2循环赛问题2.1问题描述设有n个运动员要进行网球循环赛。设计一个满足下列条件的比赛日程表:每个选手必须与其他n-1个选手各赛一次;每个选手一天只能赛一次;当n是偶数时,循环赛进行n-1天。当n是奇数时,循环赛进行n天。2.2问题分析当n=(k=1、2、3、4,……,n=2、4、8、16,……)时,此时问题比较简朴。按照分治的策略,可将所有参赛的选手分为两部分,n=个选手的比赛日程表就可以通过为n/2=个选手设计的比赛日程表来决定。递归地执行这种分割,直到只剩下2个选手时,比赛日程表的制定就变得很简朴:只要让这2个选手进行比赛就可以了。再逐步合并子问题的解即可得到原问题的解。推广当n为任意整数时:当n小于或等于1时,没有比赛。当n是偶数时,至少举行n-1轮比赛.当n是奇数时,至少举行n轮比赛,这时每轮将会有一支球队轮空。因此应对策略如下:(1)当n/2为偶数时,与n=情形类似,可用分治法求解。(2)当n/2为奇数时,递归返回的轮空的比赛要作进一步解决。可以在前n/2轮比赛中让轮空选手与下一个未参赛选手进行比赛。2.3源程序#include<iostream>usingnamespacestd;inta[100][100];intb[100];boolodd(intn)//判断n奇偶性{returnn&1;//n为奇数,返回1,n为偶数,返回0}voidcopyodd(intn)//n/2为奇数时的合并算法{intm=n/2;for(inti=0;i<m;i++){b[i]=m+i;b[m+i]=b[i];}for(inti=0;i<m;i++){//由左上角小块的值算出相应的左下角小块的值for(intj=0;j<m+1;j++){if(a[i][j]>=m){a[i][j]=b[i];a[m+i][j]=(b[i]+m)%n;}elsea[m+i][j]=a[i][j]+m;}//由左上角小块的值算出相应的右上角和右下角小块的值for(intj=1;j<m;j++){a[i][m+j]=b[i+j];a[b[i+j]][m+j]=i;}}}voidcopy(intn){intm=n/2;for(inti=0;i<m;i++)for(intj=0;j<m;j++){//由左上角小块的值算出相应的右上角小块的值a[i][j+m]=a[i][j]+m;//由右上角小块的值算出相应的左下角小块的值a[i+m][j]=a[i][j+m];//由左上角小块的值算出相应的右下角小块的值a[i+m][j+m]=a[i][j];}}voidmakecopy(intn)//合并算法{if((n/2)>1&&odd(n/2))copyodd(n);//n/2为奇数时elsecopy(n);}voidtourna(intn)//改善的分治赛算法{if(n==1){a[0][0]=0;return;}if(odd(n)){tourna(n+1);return;}//n为奇数,分治tourna(n/2);//n为偶数,分治makecopy(n);//合并}intmain(){intn;cout<<"请输入参数队数:"<<endl;cin>>n;tourna(n);cout<<"参数日程表为:"<<endl;for(inti=0;i<n;i++){for(intj=0;j<n;j++)cout<<a[i][j]<<"";cout<<endl;}system("pause");return0;}2.4运营示例3最大最小值问题3.1问题描述与分析在具有n个不同元素的集合中同时找出它的最大和最小元素算法思想:先相邻两个两个比较,较大的放入数组max[],较小的放入数组min[],然后从max[]数组求出最大,min[]数组求出最小即可。从算法描述中可以看出,占据算法的重要执行次数的是比较过程,因此算法的复杂性重要跟比较次数相关T当n是2的幂时,即对于某个正整数k,n=2kT(n)=2T(n/2)+2=2(2T(n/4)+2)+2=2*2T(n/4)+2*2+2…..=2k-1+2=3n/2-2这是最优情况,平均则比直接比较少25%3.2源程序//findmaxandmin#include<iostream>usingnamespacestd;voidMax_Min(inta[],intn){intm
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 碳排放控制技术路线图制定
- 2026福建厦门市集美区松山实验幼儿园顶岗教师招聘1人备考题库附答案详解(典型题)
- 2026湖北教师招聘统考枣阳市城区4人备考题库含答案详解(培优)
- 水电线路应急抢修方案
- 2026湖北教师招聘统考黄石市黄石港区义务教育学校招聘22人备考题库及完整答案详解1套
- 2026江西萍乡建工集团有限公司第一批次高层次和急需紧缺人才引进8人备考题库有答案详解
- 2026宁夏建材集团股份有限公司招聘8人备考题库含答案详解(培优b卷)
- 2026上海闵行区七宝镇村(合作社)、镇属公司招聘16人备考题库带答案详解(完整版)
- 2026年幼儿园绘本故事
- 隧道施工阶段的抗震监测方案
- 高考英语3500词频表
- 2023医疗质量安全核心制度要点释义(第二版)对比版
- 小学语文阅读教学中情境教学法应用
- 工厂6S管理标准
- DL-T5418-2009火电厂烟气脱硫吸收塔施工及验收规程
- (高清版)JTG D50-2017 公路沥青路面设计规范
- 安全隐患排查及整改制度
- 2024年福建烟草海晟投资管理有限公司招聘笔试参考题库附带答案详解
- 人教版小学四年级信息技术上册知识点整理与归纳
- 2024年新华文轩出版传媒股份有限公司招聘笔试参考题库含答案解析
- 小学语文文言文教学策略
评论
0/150
提交评论