算法分析结课论文分治法的应用.docx

上传人:b****2 文档编号:1729610 上传时间:2022-10-23 格式:DOCX 页数:16 大小:97.40KB
下载 相关 举报
算法分析结课论文分治法的应用.docx_第1页
第1页 / 共16页
算法分析结课论文分治法的应用.docx_第2页
第2页 / 共16页
算法分析结课论文分治法的应用.docx_第3页
第3页 / 共16页
算法分析结课论文分治法的应用.docx_第4页
第4页 / 共16页
算法分析结课论文分治法的应用.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

算法分析结课论文分治法的应用.docx

《算法分析结课论文分治法的应用.docx》由会员分享,可在线阅读,更多相关《算法分析结课论文分治法的应用.docx(16页珍藏版)》请在冰豆网上搜索。

算法分析结课论文分治法的应用.docx

算法分析结课论文分治法的应用

目录

前言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,若kf+1,则第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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 高中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1