当前位置:文档之家› 各种查找算法的性能测试

各种查找算法的性能测试

算法设计与分析实验名称:各种查找算法的性能测试作者姓名:xxxxxx完成日期:2013年9月9日星期日组的编号:28目录第一章:简介 (1)第二章:算法规范 (2)数据结构 (2)伪代码 (3)第三章:算法测试 (4)顺序查找结果 (4)二分查找结果 (5)第四章:分析讨论 (6)算法分析 (6)时间复杂度分析 (6)附录 (7)声明 (7)第一章:简介问题的描述:查找问题就是在给定的集合(或者是多重集,它允许多个元素具有相同的值)中找寻一个给定的值,我们称之为查找键。

对于查找问题来说,没有一种算法在任何情况下是都是最优的。

有些算法速度比其他算法快,但是需要较多的存储空间;有些算法速度非常快,但仅适用于有序数组。

查找问题没有稳定性的问题,但会发生其他的问题(动态查找表)。

在数据结构课程中,我们已经学过了几种查找算法,比较有代表性的有顺序查找(蛮力查找),二分查找(递归,非递归)。

利用随机函数产生N个随机整数,利用顺序查找,二分法查找(递归,非递归),并统计每一种查找所消耗的时间。

把查找花的时间排在表格里面。

第二章:算法规范数据结构:在所有的查找策略中,我们用了数组,函数作为主要的数据结构。

因为我们只是测试了不查找所需要的时间,也即分析了顺序查找,二分法查找(递归,非递归)的性能,没涉及其他复杂的操作,所以在这个项目中用了静态实现数组就可以。

伪代码如下所示顺序查找:1.int SeqSearch1(int r[ ], i nt n, int k)3.1.while (i>0 && r[i]!=k);3.2.循环 i--;3.3.返回是否找到要查找的元素k;二分法查找:一.递归1int search(int a[],int n,int k)1.1.Low=0,High=n-1; Mid=(Low+High)/2;1.2. if ((Low>=High)||(n==-1)) return -11.21 else if (a[Mid]==k) return Mid;1.22 else if (a[Mid]>g)1.3.return (search(a,Mid-1,g))1.4.return (search(a+Mid+1,n-Mid,g));二.非递归1int BinarySearch (int a[],int n,int k)1.1 Low=0; high=n-1;1.2 while(low<high)1.21 mid=(low+high)/2;1.22 if (key==a[mid])1.23 return mid查找到元素1.3 if (key>a[i])1.31 low=middle+11.32 high=middle-11.4 return查找失败第三章:测试结果测试结果:请选择查找方式1.顺序查找:二分查找:第四章:分析和讨论(一)算法思想分析:1.顺序查找:从表的一端向另一端逐个进行记录的关键字和给定值(要查找的元素)的比较,若某个记录的关键字和给定值比较相等,则查找成功,找到所查找记录;反之,若直至第一个记录,其关键字和给定值比较都不等,则表明表中没有所查记录,查找不成功。

2.二分查找:二分查找又称折半查找,二分查找首先要求待查找的表是有序表,如果要查找的元素是表的中间的那个元素,则找到要查找的元素,查找成功;如果要查找的元素比中间的那个元素小则使用相同的策略只在左边的区间查找就可以;如果要查找的元素比中间的那个元素大,则使用相同的策略在右边的区间进行查找;每次将待查找的元素的所在区间缩小一半.分析:顺序查找平均长度为(n+1)/2二分法查找平均长度为log2(n+1)-1(二)时间复杂度分析查找方法时间复杂度顺序查找O(n)二分法查找O (logn)附录:源代码(基于c语言)#include<stdio.h>#include<math.h>#include<stdlib.h>#include<time.h>#define N 40#define k 1869void main(){void ChooseSort(int a[],int n);int SeqSearch1(int a[ ], int n, int key);//顺序查找//int BinSearch2(int Array[],int SizeOfArray,int key/*要找的值*/);int BinSearch1(int Array[],int low,int high,int key);//非递归查找// int a[N],i;for(i=1;i<=N;i++){a[i]=(int)rand();//获得随机数组printf("%d ",a[i]);//输出无序随机数数组}printf("\n");//printf("请输入查找元素key:\n");//scanf("%d",&key);//printf("%d",k);printf("\n");printf("一下是各个查找算法的代号:\n");printf("一,顺序查找\n");printf("二,二分查找递归\n");printf("三,二分查找非递归\n");int figure;/*统计时间所用的标记*/printf("请输入figure:");scanf("%d",&figure);time_t start=clock();//定义程序开始时间变量time_t finish=clock();//定义程序结束时间变量double duration;switch(figure){int fff;case 1:start=clock();fff=SeqSearch1(a, N, k);//调用顺序查找printf("%d",fff);finish=clock();break;case 2:start=clock();ChooseSort(a,N);fff=BinSearch1(a,0, N, k);//调用顺序查找printf("%d",fff);finish=clock();break;case 3:start=clock();ChooseSort(a,N);fff=BinSearch2(a,N, k);//调用顺序查找printf("%d",fff);finish=clock();break;}duration=(double)(finish-start)/CLOCKS_PER_SEC;printf("\n本次的时间是:%lf seconds\n",duration);}int SeqSearch1(int a[ ], int n, int key) //数组r[1] ~ r[n]存放查找集合,n是数组中元素的个数(即查找表的长度),k是要查找的元素{int i;key=k;a[0]=key;i=N;//从后往前把表中的元素与要查找的元素进行比较while (i>0 && a[i]!=k)i--;return i;//i的值为则没找到,为非则i为要查找元素的位置}int BinSearch1(int a[],int low,int high,int key){if (low<=high){int mid = (low+high)/2;if(a[mid] ==key )return mid;else if(key<a[mid])return (BinSearch1(a,low,mid-1,key));else if(key>a[mid])return (BinSearch1(a,mid+1,high,key));}elsereturn -1;}int BinSearch2(int a[],int length,int key){int low=0,high=length-1;int mid;while (low<=high){mid = (low+high)/2;if(a[mid]==key)return mid;else if(key<a[mid])high=mid-1;else if(key>a[mid])low=mid+1;}return -1;}void ChooseSort(int a[],int n){ //选择排序int i,j,l;//int a[N];for(i=0;i<N;i++){a[i]=(int)rand();printf("%d",a[i]);//输出无序随机数数组}printf("\n");printf("***********************************");printf("\n");for(i=0;i<N;i++){for(j=i+1;j<N;j++){if(a[i]>a[j]){l=a[i];a[i]=a[j];a[j]=l;}}printf("%d\n",a[i]);}}声明我们在此声明,这个题为“各种查找算法的性能测试”的项目的所有工作是由作为一组的我们的成员的各自的努力而完成的。

人员安排:程序员:xxx测试员:xxx报告书写员:xxx。

相关主题