顺序查找与折半查找的性能比较及C++ 计时函数的介绍
2016-05-14 15:06
344 查看
顺序查找和折半查找都是很常用的查找算法,他们的查找对象都是顺序表。
顺序查找就是按照顺序表,一个一个问哎是不是你是不是你,不是就继续问下一个直到找到为止,简单有效的方法。时间复杂度为O(n),平均复杂度为O(n/2),还是一个级别。
折半查找查找的前提是此顺序表必须是有序的,即需要先排序,然后再查找。他的查找方法就是定区间,折中取数如果寻找的数大于这个数那么就在右区间继续查找,如果小于这个数就在左区间继续查找。时间复杂度为log2(n),也就是说long
long 范围内,最多查找60多次就能找到。。。,这和顺序查找完全不是一个级别的。。
看看测试程序和结果吧。
测试的结果为:
数据再大就要炸了~然而折半查找还是0,就那几十次根本测不出来好么。。。。。
然后说一下测试程序中用到的计时函数:
头文件: #include<ctime>
使用方法:定义两个时间点,如 clock_t start,end;
然后分别在需要计时部分前后加上两个函数。
start=clock(); end=clock();
最后再用一个函数就可以计算出来最终的运行时间:
double Cost_time = (double)(finish-start)/CLOCKS_PER_SEC;
这个函数大概实现过程就是,定义两个点,分别在计时部分开始前和开始后获取一个时间点,但是这个时间不是我们通常意义上的时间,而是一种类似于运行次数之类的,然后除以CPU有关的数,得出来的就是时间。是不是s不太确定,但是可以反映程序运行的快慢了~
顺序查找就是按照顺序表,一个一个问哎是不是你是不是你,不是就继续问下一个直到找到为止,简单有效的方法。时间复杂度为O(n),平均复杂度为O(n/2),还是一个级别。
折半查找查找的前提是此顺序表必须是有序的,即需要先排序,然后再查找。他的查找方法就是定区间,折中取数如果寻找的数大于这个数那么就在右区间继续查找,如果小于这个数就在左区间继续查找。时间复杂度为log2(n),也就是说long
long 范围内,最多查找60多次就能找到。。。,这和顺序查找完全不是一个级别的。。
看看测试程序和结果吧。
#include <iostream> #include <algorithm> #include <cstring> #include <cstdio> #include <ctime> #define maxn 100000005 using namespace std; int main(){ while(1){ long long num; cout<<"输入查找的数据量:"<<endl; cin>>num; long long *s=new long long[num],i=num-1; while(i>=0){ s[i]=i; i--; } cout<<"请输入要查找的元素:"<<endl; long long key; cin>>key; clock_t start1,finish1; start1=clock(); for(int i=1;i<num;i++) if(s[i]==key) break; finish1=clock(); double Cost_time1 = (double)(finish1-start1)/CLOCKS_PER_SEC; cout<<"顺序查找所花费的时间为:"<<Cost_time1<<"s"<<endl; clock_t start2,finish2; start2=clock(); long long left=0,right=num-1,mid=(left+right)/2; while(left<=right){ if(s[mid]==key) break; else if(s[mid]<key) right=mid-1; else left=mid+1; mid=(left+right)/2; } finish2=clock(); double Cost_time2 = (double)(finish2-start2)/CLOCKS_PER_SEC; cout<<"顺序表折半查找所花费的时间为:"<<Cost_time2<<"s"<<endl; } return 0; }
测试的结果为:
数据再大就要炸了~然而折半查找还是0,就那几十次根本测不出来好么。。。。。
然后说一下测试程序中用到的计时函数:
头文件: #include<ctime>
使用方法:定义两个时间点,如 clock_t start,end;
然后分别在需要计时部分前后加上两个函数。
start=clock(); end=clock();
最后再用一个函数就可以计算出来最终的运行时间:
double Cost_time = (double)(finish-start)/CLOCKS_PER_SEC;
这个函数大概实现过程就是,定义两个点,分别在计时部分开始前和开始后获取一个时间点,但是这个时间不是我们通常意义上的时间,而是一种类似于运行次数之类的,然后除以CPU有关的数,得出来的就是时间。是不是s不太确定,但是可以反映程序运行的快慢了~
相关文章推荐
- 联发科Linkit 7688 (二)GPIO基本操作与C语言编程
- 《C++ Concurrency in Action》读书笔记一 多线程与线程管理
- C++中通过指针来交换两个数
- 在OpenCV环境下写的两个图像平移C和C++源代码!
- 嵌入式C语言实例(达内2013)
- more effective c++ item26 控制对象的数量
- C++编译时多态之运算符重载
- C++中字节的长度
- ## c++学习笔记 --基础篇(第一周)##
- C++ 第二次课堂作业(反转链表)
- C++ 第二次课堂作业(反转链表)
- C/C++ 关于大小端模式
- C++实现“简单计算器”
- C语言_左移(<<)和右移(>>)
- c/c++ 参数传递 - 数组
- Oxford building dataset数据集计算正确相关图像ground truth的C++代码
- C++ 传递对象---用值传递对象
- 1.C++学习笔记:内存模型
- [容器]STL之set容器详解
- C++日记——浅谈继承