版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、数数据据结结构构课课程程设设计计报报告告搜索算法效率比较的设计搜索算法效率比较的设计专业专业计算机科学与技术学生姓名学生姓名Xxxxx班级班级Xxxx学号学号Xxxx指导教师指导教师Xxx完成日期完成日期2016 年 6 月 16 日搜索算法效率比较的设计2目目 录录1.设计题目.32.设计目的及要求.32.1目的.32.2要求.33.设计内容.34.设计分析.44.1.空间复杂度.54.2 非递归线性搜索设计.54.3 递归线性搜索.54.4 二叉搜索设计.65.设计实践.75.1 非递归线性搜索模块设计.75.2 递归线性搜索模块设计.75.二叉搜索模块设计.75.4.主程序模块设计.86
2、 测试方法.107.程序运行效果.118.设计心得.12搜索算法效率比较的设计3搜索算法效率比较的设计搜索算法效率比较的设计1.设计题目设计题目给定一个已排序的由N个整数组成的数列0,1,2,3,N-1,在该队列中查找指定整数,并观察不同算法的运行时间。考虑两类算法:一个是线性搜索,从某个方向依次扫描数列中各个元素;另一个是二叉搜索法。要完成的任务是:分别用递归和非递归实现线性搜索;分析最坏情况下,两个线性搜索算法和二叉搜索算法的复杂度;测量并比较这三个方法在N=100,500,1000,2000,4000,6000,8000,10000时的性能。2.2.设计目的及要求设计目的及要求 2.1目
3、的(1)需要同学达到熟练掌握C语言的基本知识和技能;(2)基本掌握面向对象程序设计的基本思路和方法;(3)能够利用所学的基本知识和技能,解决简单的程序设计问题;2.2要求学生必须仔细阅读数据结构,认真主动完成课设的要求,有问题及时主动通过各种方式与教师联系沟通;要发挥自主学习的能力,充分利用时间,安排好课设的时间计划,并在课设过程中不断检测自己计划完成情况;独立思考,课程设计中各任务的设计和调试哦要求独立完成,遇到问题可以讨论,可以通过同学间相互讨论而解决。3.3.设计内容设计内容 任何程序基本上都是要用特定的算法来实现的。算法性能的好坏,直接决定了所实现程序性能的优劣。此次对有关算法设计的基
4、本知识作了简单的介绍。针对静态查找问题,以搜索算法的不同实现,并对非递归线性搜索算法、递归线性搜索算法和二叉搜索算法这三种方法进行了比较和分析。算法是为求解一个问题需要遵循的、被清楚地指定的简单指令的集合。解决一个问题,可能存在一种以上的算法,当这些算法都能正确解决问题时,算法需要的资源量将成为衡量算法优良度的重要度量,列如算法所需的时间、空间等。算法是对问题求解过程的一种描述,是为解决一个问题或一类问题给出的一个正确的,有限长的操作序列。由于查找一个数的过程,无论运用哪种算法对于电脑来说速度都是非常快的,都爱1ms之内,无法用计时函数测试出来。所以为了能够直观准确地表示出各个算法间的差异,此
5、程序用了循环查找的方法,具体的思想是:先随机生成搜索算法效率比较的设计43000个数作为查找的数据源,再随机生成3000个数作为被查找的数,让当前的查找算法运行一趟,这样就相当于运行了3000次。 这样还不具有一定的客观性,用flag标记出刚刚运行完查找后的结果,从数据源中找到目标的数标记为1,没找到的标记为0,并以此存为两个数组,最后我们就可以使用这两个数组再次分别进行循环查找,同时开始计时,如此一来就可以计算出各个算法在查找成功的情况下需要多少时间,反之在没查找到的情况下需多长时间了。4.4.设计分析设计分析表(List)是用来存放多个相同类型数据的数据结构之一。对表的所有操作都可以通过使
6、用数组来实现。在本题目中,使用数组来存放数列。虽然数组是动态指定的,但是还是需要对表的大小的最大值进行估计。一般需要估计得大一些,从而会浪费一定的空间。本题目中传递数组时,以常数参数const a的方式,这样可以防止在搜索是数据被修改。 123N-1两种线性搜索算法的程序结构分别为以下所示。非递归线性搜索从数组的最左边开始,逐个比较,直到找到所搜索的对象或者直到最后搜索失败。递归搜索从最右开始搜索。为什么不从最左边开始?因为从左边开始,每次递归除要传递待处理数列的左边界外,还需要传递运算数组的右边界(即N-1,这在本题目里也是变化的)。从而右边开始,每次只需传递数组的右边界(左边界固定为0)。
7、所谓时间复杂度:时间复杂度 在刚才提到的时间频度中,n称为问题的规模,当n不断变化时,时间频度T(n)也会不断变化。但有时我们想知道它变化时呈现什么规律。为此,我们引入时间复杂度概念。 一般情况下,算法中基本操作重复执行的次数是问题规模n的某个函数,用T(n)表示,若有某个辅助函数f(n),使得当n趋近于无穷大时,T(n)/f(n)的极限值为不等于零的常数,则称f(n)是T(n)的同数量级函数。记作T(n)=(f(n),称(f(n) 为算法的渐进时间复杂度,简称时间复杂度。 按数量级递增排列,常见的时间复杂度有:常数阶O(1),对数阶O(log2n),线性阶O(n), 线性对数阶O(nlog2
8、n),平方阶O(n2),立方阶O(n3),., k次方阶O(nk),指数阶O(2n)。随着问题规模n的不断增大,上述时间复杂度不断增大,算法的执行效率越低。最坏时间复杂度和平均时间复杂度:最坏情况下的时间复杂度称最坏时间复杂度。一般不特别说明,讨论的时间复杂度均是最坏情况下的时间复杂度。 这样做的原因是:最坏情况下的时间复杂度是算法在任何输入实例上运行时间的上界,这就保证了算法的运行时间不会比任何更长。 在最坏情况下的时间复杂度为T(n)=0(n),它表示对于任何输入实例,该算法的运行时间不可能大于0(n)。搜索算法效率比较的设计5 平均时间复杂度是指所有可能的输入实例均以等概率出现的情况下,
9、算法的期望运行时间。此算法可以通过非递归线性搜索,线性递归搜索以及二叉法三种来进行搜索算法效率比较,从中辨析出三种算法中哪种算法最有效。同时在主函数中用clock()来调用库函数 4.1.空间复杂度一个程序的空间复杂度是指运行完一个程序所需内存的大小。利用程序的空间复杂度,可以对程序的运行所需要的内存多少有个预先估计。一个程序执行时除了需要存储空间和存储本身所使用的指令、常数、变量和输入数据外,还需要一些对数据进行操作的工作单元和存储一些为现实计算所需信息的辅助空间。程序执行时所需存储空间包括以下两部分。固定部分。这部分空间的大小与输入/输出的数据的个数多少、数值无关。主要包括指令空间(即代码
10、空间)、数据空间(常量、简单变量)等所占的空间。这部分属于静态空间。可变空间,这部分空间的主要包括动态分配的空间,以及递归栈所需的空间等。这部分的空间大小与算法有关。4.2 非递归线性搜索设计 在一个已知无序队列中找出与给定关键字相同的数的具体位置。原理是让关键字与队列中的二叔从第一个开始逐个比较,直到找出与给定关键字相同的数为止。它对于表的结构没有任何要求,其缺点是查找效率低;其优点是算法简单。4.3 递归线性搜索 递归作为一种算法在程序设计语言中广泛应用,是指函数/过程/子程序在运开始两数是否相等是否返回位置返回搜索算法效率比较的设计6行过程序中直接或间接调用自身而产生的重入现象,程序调用
11、自身的编程技巧成为递归。一个过程或函数在其定义或说明中又直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次城府计算,大大地减少了程序的代码量。递归的能力在于用有线的语句来定义对象的无限集合。用递归思想写出来的程序往往十分简洁易懂。递归就是在过程或函数里调用自身;在使用递增归策略时,必须有一个明确的递归结束条件,成为递归出口。4.4 二叉搜索设计二叉搜索的算法思想是将数列按有序化(递增或递减)排列,查找过程中采用跳跃式方式查找,即先以有序数列的中点位置为比较对象,如果要找的元素值小于该中点
12、元素,则将待查序列缩小为左半部分,否则为右半部分。通过一次比较,将查找区间缩小一般。流程图:开始搜索算法效率比较的设计75.5.设计实践设计实践5.1 非递归线性搜索模块设计非递归线性搜索的特点在于它的,每一次进行搜索时总是从数组的最左边开始,逐个比较,直到找到所搜索的对象或者直到最后搜索失败。 int IterativeSequentialSearch(const int a,int x,int n) int i; for(i=0;ik,则中点值之后的数都大于 k,所以 k 值在该表的左边, 所以确定一个新的查找区间; 如果中点值k,则中点值之后的数都小于 k,k 值在该表的右边,再在 该表
13、的右边确定一个新的查找区间; 依次循环。它的核心程序如下:int BinarySearch(const int a,int x,int n) int low,mid,high; low=0;high=n-1; while(lowx) low=mid+1; else if(amidx) high=mid-1; else return mid; return -1; 对于输入数据量很大时,线性搜索的时间太慢,不宜使用。二叉搜索采用折半的思想,它的运行时间为 O(log2N) ,比线性搜索要快许多,特别是在处理的数据量比较大的时候非常有用。搜索算法效率比较的设计85.4.主程序模块设计此程序的作用是
14、分别进行了定义,调用函数。并且通过 clock()函数调用库函数。程序如下:int main ( )/* clock() 返回函数运行时间 */int i,n,x,a10000;long k,l;printf(Please enter n:n);scanf(%d,&n); /* 输入数据 */ if(n10000) /*处理异常输入*/printf(error!);return -1;x=n; /* 指定要查找的数 */for(i=0;in;i+) /*数组初始化 */ai=i;printf(Please enter iterations:n); /*为了更准确地计算运行时间,我们可以重复多次
15、调用算法,再取平均值*/scanf(%ld,&k);if(k1) /*处理异常输入*/printf(error!);return -1;/* 非递归线性搜索 */start = clock(); /* 记录函数的开始时间 */for(l=0;lk;l+)IterativeSequentialSearch(a,x,n);stop = clock(); /*记录函数的结束时间*/duration = (double)(stop - start)/CLK_TCK; /*计算函数运行时间 */printf(nIterativeSequentialSearch:nIterations:%ldnTicks
16、:%dnTotal Time:%.8lfnDuration:%.8lfn,k,(int)(stop-start),duration,duration/k);/*输出花费时间*/搜索算法效率比较的设计9/* 递归线性搜索 */start = clock(); /*记录函数的开始时间*/for(l=0;lk;l+)RecursiveSequentialSearch(a,x,n);stop = clock(); /*记录函数的结束时间*/duration = (double)(stop - start)/CLK_TCK; /*计算函数运行时间*/printf(nRecursiveSequential
17、Search:nIterations:%ldnTicks:%dnTotal Time:%.8lfnDuration:%.8lfn,k,(int)(stop-start),duration,duration/k);/* 输出花费时间*/*二叉搜索*/printf(nIterations of Binary Search is 100 times of iterations more than other two searchsn);k=100*k; /*由于二叉搜索的时间比较快,为了避免出现 0 秒,二叉搜索算法调用的次数是线性搜索的 100 倍*/start = clock(); /*记录函数
18、的开始时间*/for(l=0;lk;l+)BinarySearch(a,x,n);stop = clock(); /*记录函数的结束时间*/duration = (double)(stop - start)/CLK_TCK; /*输出花费时间*/printf(nBinarySearch:nIterations:%ldnTicks:%dnTotal Time:%.8lfnDuration:%.8lfn,k, (int)(stop-start), duration,duration/k);/* 输出花费时间*/return 1;6 6 测试方法测试方法按题目要求分别输入 N=100,500,100
19、0,2000, 10000,对于每一个 N 要选择不同的重复调用次数 K,直到测试结果趋于稳定。搜索算法效率比较的设计10按要求输入数据,测试程序能否对输入内容进行数据合法性检测并进行相应的异常处理。列如 N=0,K=0,考察程序对异常情况进行处理的能力。测试案例:N1005001000重复次数2051000总时钟跳数105函数执行 K 次总时间(秒)0.001000000.00000000 0.00500000 非递归线性搜索平均运行时间(秒)0.000050000.000000000.00000500 重复次数2051000总时钟跳数1044函数执行 K 次总时间(秒)0.00100000
20、0.00000000 0.04400000 递归线性搜索平均运行时间(秒)0.000005000.00000000 0.00004400 重复次数2000500100000 总时钟跳数1013函数执行 K 次总时间(秒)0.001000000.00000000 0.01300000 二叉搜索平均运行时间(秒)0.000000500.000000000.00000013N200010000重复次数6080总时钟跳数15函数执行 K 次总时间(秒)0.00100000 0.00500000 非递归线性搜索平均运行时间(秒)0.000016670.00006250重复次数6080总时钟跳数636函数
21、执行 K 次总时间(秒)0.00600000 0.03600000 递归线性搜索平均运行时间(秒)0.000100000.00045000重复次数60008000总时钟跳数11函数执行 K 次总时间(秒)0.00100000 0.00100000 二叉搜索平均运行时间(秒)0.000000170.00000012搜索算法效率比较的设计11在实际测试中,当程序运行时间太快,会无法获得实际运行时间。为了避免这种情况,可以将同一操作运行 K 遍,得到 1 秒以上的时间,再将结果除以重复次数 K 得到平均时间。若单重循环还不能达到目的,可用多重嵌套循环解决。7.7.程序运行效果程序运行效果当运行程序时,所输入 N、K 的值没有错误的时候会出现如下界面:当输入的值有错误的时候,表示所输入的值不在所
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 运动干预肥胖效果评估-洞察与解读
- 多细胞共培养微流控平台-洞察与解读
- 现代美术创作教学案例汇编
- 六年级英语语法重点解析教案
- 品牌推广活动策划及效果评估模板
- 实际出资人投资协议范例与说明
- 电缆敷设施工工艺
- 小学四年级上册劳动技术教案
- 旅行社行程安排制度
- 交通运输安全管理制度手册
- 商飞在线测评题库
- 物控工作培训
- DBJ41T 189-2017 地下连续墙检测技术规程
- 小学语文命题能力培训
- 外墙保温板(匀质板)施工方案
- 前列腺癌治疗现状
- 24年10月自考13003数据结构与算法试题及答案
- 《人工智能技术基础》课件 第5章 注意力机制
- 保安公司组织架构岗位制度及保安管理制度
- NWT系列扫频仪说明书-中英文版
- 感觉统合教育指导师理论考试复习题库(含答案)
评论
0/150
提交评论