算法分析结课论文分治法的应用.docx
- 文档编号:1729610
- 上传时间:2022-10-23
- 格式:DOCX
- 页数:16
- 大小:97.40KB
算法分析结课论文分治法的应用.docx
《算法分析结课论文分治法的应用.docx》由会员分享,可在线阅读,更多相关《算法分析结课论文分治法的应用.docx(16页珍藏版)》请在冰豆网上搜索。
算法分析结课论文分治法的应用
目录
前言1
正文1
2.1设计的目的和意义1
2.1.1设计的目的1
2.1.2设计的意义1
2.2设计的目标与总体方案1
2.1.1设计的目标1
2.1.2设计的总体方案2
2.3设计的方法和内容2
2.3.1硬件环境要求2
2.3.2软件环境需求2
2.3.3设计的流程图2
2.3.4设计的方法及详细内容2
2.3.4.1让用户输入信息2
2.3.4.2数据整理3
2.3.4.3查找数据并输出结果4
2.3.4.4询问用户是否继续5
2.4设计的创新与关键技术6
2.4.1设计的特点6
2.4.2设计的难点7
2.4.3软硬件调试及结果分析7
2.5结论7
致谢7
参考文献:
8
附录:
9
前言
算法研究是计算机科学的核心。
近年来,算法领域去得了很多重要的进展。
这些进展包括快速算法的开发,如发明了傅里叶变换开速算法,以及不存在有效算法的本质问题的惊人发现。
这些结果点燃了计算机学者对算法研究的兴趣。
算法设计与分析已成为一个受到广泛注意的领域。
计算机的普及极大地改变了人们的生活。
目前,各行业、各领域都广泛采用了计算机的信息技术,并由此产生出开发各种应用软件的需求。
为了最少的成本、最快的速度、最好的质量开发出适合各种应用需求的软件,必须遵循软件工程的原则。
设计一个高效的程序不仅需要编程小技巧,更需要合理的数据组织和清晰高效的算法,这正是计算机科学领域数据结构与算法设计所研究的主要内容。
一些著名的计算机科学家在有关计算机科学教育的论述中认为,计算机科学是一中创造性思维活动,其教育必须面向设计。
计算机算法设计与分析正是一门面向设计,且处于计算机学科核心地位的教育课程。
通过对计算机算法系统的学习与研究,掌握算法设计的主要法方法,培养对算法的计算复杂性正确分析的能力,为独立设计算法和对算法进行复杂性分析奠定坚实的理论基础。
本程序主要采用分治法的思想,在若干个数据中找出其中第k小的数。
通过对实际问题的分析,借鉴分治法的特点,并利用C语言编写具有合理的数据组织和清晰高效的算法的程序,从而达到解决实际的问题的目的。
正文
和排序密切相关的一个问题是在个元素的序列中选择第小元素。
一个显然的解决方法是排序序列为非递减序,然后定位第个元素。
正如我们看到的,这需要nlogn次比较。
通过细心应用分治策略,可以用O(n)步找到第小的元素。
2.1设计的目的和意义
2.1.1设计的目的
随着科学技术的不断提高,计算机科学技术日渐成熟。
我们应该要多学习计算机,并利用它为人人类做出有用的事。
作为学计算机的我们更应该对它更深的学习,为了巩固自己学到的知识、锻炼自己设计出一个具有合理的数据组织和清晰高效的算法、并将C语言运用于实践,进一步巩固C语言讲法规则。
是自己能编写结构清晰、风格良好、逻辑严谨的程序,从而具备解决综合性实际问题的能力。
2.1.2设计的意义
通过对该问题的设计和解决,培养了自己运用经典算法的思想并综合利用C语言编写程序解决实际问题的能力,通过分析实际问题再设计简单且可行的算法去解决它的能力,加强算法的运用及对软件工程方法的初步认识,提高软件系统分析能力和程序文档建立、归纳总结的能力。
2.2设计的目标与总体方案
任何工程在创建之前总会有一个所需奋斗的目标,这样才能有追求的方向,还应有一个具体的方案,这样才可能着手进行实施。
2.1.1设计的目标
通过设计要使程序在最后运行过程中达到理想的效果。
首先,让用户统计要查找的元素的总数,并输入到系统中;其次,让用户依次输入预先准备好的数据;再次,让用户想要查找的第小的元素的值;最后,判断用户输入的值的大小是否符合要求,并告诉给用户,若符合要求,经过计算后,将查找的结果告诉给用户,结束该程序。
2.1.2设计的总体方案
该程序主要运用分治法的思想。
首先,利用for循环的功能和数组的作用将用户输入的数据进行筛选,即将重复的元素去掉,留下没有重复数据的一组数;再用while语句判断永福输入的k值是否符合要求;最后,将留下的数组以中位数为准,分成三个数组,并结合while语句的功能,实现循环,逐步将得到的新数组分成三个数组,直到符合用户的要求为止,并输出结果。
总之通过实施整体方案,使可以工程运行,并且实现良好的运行效果,成为一个有利用价值的程序。
2.3设计的方法和内容
该程序在逸夫楼409机房的计算机上进行编写和调试,所用的软件为由吴进设计的版本号为1.9.1的win-tc。
2.3.1硬件环境要求
CPU:
PentiumIII或更高级别,显卡:
geforce2及以上,内存:
32MB或更多,硬盘:
512MB或更多。
2.3.2软件环境需求
操作系统:
Windows98/2000/2003/NT/XP,WindowsVista系统请在兼容模式下运行。
必备的软件:
TurboC全版本;Win-TC全版本。
2.3.3设计的流程图
图2-1为该程序的设计流程图,当用户进入运行界面后,按照提示先输入预先已准备好的数据的总数目,再依次输入各个元素;系统将数据进行整理后,等待用户输入k值的大小,并立即判断用户想要查找的数据是否存在;若存在,则用分治法的思想进行查找,找到后输出结果;最后,提示用户是否想继续查找另一个第k小的数,若用户想,则程序重复上述步骤,否则,结束程序。
2.3.4设计的方法及详细内容
本程序可以分为四大块:
让用户输入信息、整理数据、查找数据并输出结果、询问用户是否继续。
2.3.4.1让用户输入信息
此部分可以让用户在运行程序的界面输入各个数据,即:
用户可以根据实际需要,先输入预先准备查找的数据的总数目;再依次输入各个数据;最后输入k的具体数值,因需要考虑实际情况,对k的大小作了要求。
关键代码是:
printf("Qingshurushuzudechangdu:
");/*提示用户输入*/
scanf("%d",&length0);/*让用户输入数据的总数目*/
printf("\nQingyicishu………eshu:
\n");/*提示用户输入*/
for(i=1;i<=length0;i++)
scanf("%d",&yuan[i]);/*让用户依次输入各个元素*/
……………
while(z>0)
{printf("Qingshurukdezhi:
");/*提示用户输入k的值*/
scanf("%d",&k);
if(k<1)/*根据用户输入的各个元素,判断第k小的数是否存在*/
printf("Duibuqi!
Nishurudeshuzitaixiao.\n\n");
elseif(k>length)
printf("Nishu………di%dxiaodeshu.\n\n",k);
else
z--;
}
否
能
k=k-f-1
e、f、g变为初值e、f、g变为初值
kk
大小
于于
f+1f+1
k=f+1
是
否
图2-1程序设计流程图
2.3.4.2数据整理
此部分主要对用户依次输入的所有元素进行整理。
即:
将用户输入的每个元素依次存入到一个数组中,再对此数组进行扫描,若没有发现了相同的元素,则将该元素存入到另一个数组中,否则,继续扫描,且不将该数存在另一个数组中。
因为,这样可以方便地告诉用户他想要查找的第k小的数是否存在,也可以减小在后面用分治法查找数据时的时间复杂度。
其具体做法如下:
序号:
123456789
yuan[i]532521656
a[]5原数组第1个数赋给a[1],i++
a[]53原数组第2个数赋给a[2],i++
a[]532原数组第3个数赋给a[3],i++
a[]532yuan[4]=a[1],
a[]532yuan[5]=a[3],i++
a[]5321原数组第6个数赋给a[4],i++
a[]53216原数组第7个数赋给a[5],i++
a[]53216yuan[8]=a[1],i++
a[]53216yuan[9]=a[7],i++结束
则,经过整理后的数组a[]所存的元素分别为5、3、2、1、6,且将用户输入的元素的总数目变为5。
其关键代码是:
a[1]=yuan[1];/*根据常规,可首先将数组yuan[]中的第一个数赋给a[]*/
for(i=1;i<=length0;i++)/*依次取yuan[]中的数与a[]中数进行比较*/
{length++;/*数组a[]的长度加1*/
for(j=1;j {if(a[j]==yuan[i])/*若a[]中有与yuan[i]相等的数,让a[]与yuan[i+1]相比*/ {length--;/*因yuan[i]不能存入a[]中*/ break;} elseif(a[j]! =yuan[i]) {if(j==length)/*判断a[]中的数是否全部与yuan[i]不相等*/ j++; else a[length]=yuan[i];}}/*将yuan[i]存入a[]中*/ } 2.3.4.3查找数据并输出结果 这部分是该程序的核心部分,因为该部分主要是为了减小查找的时间复杂度,用分治法的思想来完成,先在a[]中选出一个数(中位数)并赋给x,并以x为基准,将a[]分为三部分。 第一部分元素都大于x,第二部分元素都小于x,第三部分元素等于x(即该部分中只有x)。 设第二部分中的元素个数为f,若k 它也是在编写程序时遇到的最大困难。 具体的实例如下: 分别定义三个数组da[]、xiao[]、deng[]存储数组a[]分成的三部分,用e、f、g分别记录这三个数组所存储的元素的个数,先令k=3。 a[length]53216x=a[(length+1)/2]=a[3]=2 da[]5e++,i++ da[]53e++,i++ deng[]2g++,i++ xiao[]1f++,i++ da[]536e++,i++结束,e=3;f=1;g=1 比较k与f+1的大小,则第k(k=3)小的数在da[]中,k=k-f-1=1,将da中的元素依次赋给a中,并使e=f=g=0。 a[length]536x=a[(length+1)/2]=a[2]=3 da[]5e++,i++ deng[]3g++,i++ da[]56e++,i++结束,e=2;f=0;g=1 比较k与f+1的大小,显然k=f+1。 所以第k小的数查找成功,输出结果3,即为用户想要在他输入的一组元素里(532521656)查找的第3小的数。 该部分的关键代码是: while(k>0) {x=a[(length+1)/2];/*将a[]的中位数赋给变量x*/ deng[g]=x; for(i=1;i<=length;i++)/*对a[]进行扫描*/ {if(i==(length+1
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 算法 分析 论文 分治 应用
![提示](https://static.bdocx.com/images/bang_tan.gif)