数据结构课程设计
算法分析:搜索算法效率比较
专业 Xxxx xxxx xxxxx xxxxxxxxxxx
学生姓名 班学
1
级 号
目 录
1 设计题目 ................................................................................................................. 1
2 设计分析 ................................................................................................................. 2
3 设计实现 ................................................................................................................. 3
4测试方法 ................................................................................................................... 6
5测试结果.................................................................................................................. 7
6 设计小结 .................................................................................................................. 7
1.设计题目
给定一个已排序的由N个整数组成的数列{0,1,2,3,……,N-1},在该队列中查找指定整数,并观察不同算法的运行时间。
考虑两类算法:一个是线性搜索,从某个方向依次扫描数列中各个元素;另一个是二叉搜索法。
要完成的任务是:
分别用递归和非递归实现线性搜索;
分析最坏情况下,两个线性搜索算法和二叉搜索算法的复杂度; 测量并比较这三个方法在N=100,500,1000,2000,4000,6000,8000,10000时的性能。
3
2.设计分析
在实际测试中,当程序运行时间太快,会无法获得实际运行时间。为了避免这种情况,可以将同一操作运行K遍,得到1秒以上的时间,再将结果除以重复次数K得到平均时间。若单重循环还不能达到目的,可用多重嵌套循环解决。
3 设计实现
#include clock_t start, stop; /* clock_t 是内置数据类型,用于计时 */ double duration; /* 记录函数运行时间,以秒为单位*/ /***********非递归线性搜索x ***********/ int IterativeSequentialSearch(const int a[],int x,int n) { int i; for(i=0;i return i; return -1; /* 未找到x */ 5 } /*********** 递归线性搜索x ***********/ int RecursiveSequentialSearch(const int a[],int x,int n) { } /***********二叉搜索 x ***********/ int BinarySearch(const int a[],int x,int n) { } int main ( ) int low,mid,high; /*数组的左右边界*/ low=0;high=n-1; while(low<=high) { } return -1; /* 未找到x */ mid=(low+high)/2; /*计算居中元素*/ if(a[mid] if(n==0) return -1; /* 未找到x */ if(a[n-1]==x) /* 找到x */ return n-1; return RecursiveSequentialSearch(a,x,n-1); /* 继续递归线性搜索 */ else if(a[mid]>x) /*比居中元素小*/ high=mid-1; /*改变右边界*/ else return mid; /*找到x */ { /* clock() 返回函数运行时间 */ int i,n,x,a[10000]; long k,l; printf(\"Please enter n:\\n\"); scanf(\"%d\ /* 输入数据 */ if(n<100||n>10000) /*处理异常输入*/ { } x=n; /* 指定要查找的数 */ for(i=0;i printf(\"Please enter iterations:\\n\"); /*为了更准确地计算运行时间,我们可以重复 多次调用算法,再取平均值*/ scanf(\"%ld\ if(k<1) /*处理异常输入*/ { } /*********** 非递归线性搜索 ***********/ start = clock(); /* 记录函数的开始时间 */ for(l=0;l duration = ((double)(stop - start))/CLK_TCK; /*计算函数运行时间 */ printf(\"\\nIterativeSequentialSearch:\\nIterations:%ld\\nTicks:%d\\nTotal printf(\"error!\"); return -1; Time:%.8lf\\nDuration:%.8lf\\n\输出花费时间*/ /*********** 递归线性搜索 ***********/ 7 start = clock(); /*记录函数的开始时间*/ for(l=0;l duration = ((double)(stop - start))/CLK_TCK; /*计算函数运行时间*/ printf(\"\\nRecursiveSequentialSearch:\\nIterations:%ld\\nTicks:%d\\nTotal Time:%.8lf\\nDuration:%.8lf\\n\输出花费时间*/ /***********二叉搜索***********/ printf(\"\\nIterations of Binary Search is 100 times of iterations more than other two k=100*k; /*由于二叉搜索的时间比较快,为了避免出现0秒,二叉搜索算法 searchs\\n\"); 调用的次数是线性搜索的100倍*/ start = clock(); /*记录函数的开始时间*/ for(l=0;l stop = clock(); /*记录函数的结束时间*/ duration = ((double)(stop - start))/CLK_TCK; /*输出花费时间*/ printf(\"\\nBinarySearch:\\nIterations:%ld\\nTicks:%d\\nTotal Time:%.8lf\\nDuration:%.8lf\\n\(int)(stop-start), duration,duration/k);/* 输出花费时间*/ } return 1; 4.测试方法 1.按题目要求分别输入N = 100, 500, 1000, 2000, 4000, 6000, 8000, 10000, 对于每一 个N要选择不同的重复调用次数K,直到测试结果趋于稳定。 2.按要求输入数据,测试程序能否对输入内容进行数据合法性的检测并进行相应的异常处理。例如N =0, -500, 100000,或者K=0,-1等,考察程序对异常情况进行处理的能力。 5 测试结果 6 设计小结 在这次为期五个半天的课程设计里,也让我从中有所收获。虽说是五个半天,但在课后还是花了不少时间。 首先就由于用的是C语言编写,所以又拿起了大一的C教材课本,以此来弥补一些知识,但最主要的还是数据结构教材。看教材中的程序时,发现一个程序设计就是算法与数据结构的结合体,看程序有时都看不懂,更别提自己编译了,觉得自己在这方面需要掌握的内容还有很多狠多。 通过这段时间的课程设计,我认识到数据结构是一门比较难的课程。需要多花时间上机练习。这次的程序训练培养了我实际分析问题、编程和动手能力,使我掌握了程序设计的基本技能,提高了我适应实际,实践编程的能力。 总的来说,这次课程设计让我获益匪浅,对数据结构也有了进一步的理解和认识。但也让我认识到我还有很多的不足,需要大量的学习,以此来达到能力的提高及熟练的应用。 9 因篇幅问题不能全部显示,请点此查看更多更全内容