【数据结构】搜索算法效率比较
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
1
数据结构课程设计
算法分析:搜索算法效率比较
专业 Xxxx
学生姓名 xxxx
班级 xxxxx
学
号 xxxxxxxxxxx
目录
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.设计分析
5
在实际测试中,当程序运行时间太快,会无法获得实际运行时间。为了避免这种情
况,可以将同一操作运行K 遍,得到1秒以上的时间,再将结果除以重复次数K 得到平均时间。若单重循环还不能达到目的,可用多重嵌套循环解决。
3 设计实现
#include
#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 if(a[i]==x) /* 找到x */ return i; return -1; /* 未找到x */ /*********** 递归线性搜索x ***********/ int RecursiveSequentialSearch(const int a[],int x,int n) { if(n==0) return -1; /* 未找到x */ if(a[n-1]==x) /* 找到x */ return n-1; return RecursiveSequentialSearch(a,x,n-1); /* 继续递归线性搜索*/ } /***********二叉搜索x ***********/ int BinarySearch(const int a[],int x,int n) { int low,mid,high; /*数组的左右边界*/ low=0;high=n-1; while(low<=high) { mid=(low+high)/2; /*计算居中元素*/ if(a[mid] low=mid+1; /*改变左边界*/ else if(a[mid]>x) /*比居中元素小*/ high=mid-1; /*改变右边界*/ else return mid; /*找到x */ } return -1; /* 未找到x */ } int main ( ) /* clock() 返回函数运行时间*/ int i,n,x,a[10000]; long k,l; printf("Please enter n:\n"); scanf("%d",&n); /* 输入数据*/ if(n<100||n>10000) /*处理异常输入*/ { printf("error!"); return -1; } x=n; /* 指定要查找的数*/ for(i=0;i a[i]=i; printf("Please enter iterations:\n"); /*为了更准确地计算运行时间,我们可以重复多次调用算法,再取平均值*/ scanf("%ld",&k); if(k<1) /*处理异常输入*/ { printf("error!"); return -1; } /*********** 非递归线性搜索***********/ start = clock(); /* 记录函数的开始时间*/ for(l=0;l IterativeSequentialSearch(a,x,n); stop = clock(); /*记录函数的结束时间*/ duration = ((double)(stop - start))/CLK_TCK; /*计算函数运行时间*/ printf("\nIterativeSequentialSearch:\nIterations:%ld\nTicks:%d\nTotal Time:%.8lf\nDuration:%.8lf\n",k,(int)(stop-start),duration,duration/k);/*输出花费时间*/ /*********** 递归线性搜索***********/ 7