链接:https://blog.csdn.net/qq_41765114/article/details/88354772
O(n):O(n2):
O(n2):原因:
O(lgn):原因:2的x次方 = n 所以 x = lgn
还有常数阶o(1):几条语句
各级别算法复杂度分析:
① n! 弱上界是 nn,因此增长速度非常快,即超慢。
② 2^n,指数级爆发式增长,增长速度非常快,也是超慢。
③ O(n2)、O(n3),一般的竞赛题目是不允许到这种数量级的,很慢。
但是一般都可以优化到 nlgn。O(n2)级别的算法有:冒泡排序、插入排序和选择排序等。
④ O(nlgn),及格,一般分治法可以缩小层数到 lgn,而每层的复杂度一般为O(n),
例如:归并排序和快速排序等。
⑤ O(n),比较优秀的算法,比如连续求和最大子数组的线性解。
⑥ O(sqrt(n)),比O(n)更快,这种算法比较少,但不是不存在,比如判断一个数是否为素数。
⑦ O(lgn),很优秀,比如二分查找,但是这种算法往往对于输入数据格式有要求。
⑧ O(1),常量级,这是为数极少的效率最高的算法,多数是数据很规则。
各算法复杂度与运行时间对应关系:
对于一般的测评机来说,CPU 的运算速度大概是 1s 进行 108 次运算(好的CPU可能快10倍)。
经典:
顺序查找与折半查找的性能比较及C++ 计时函数的介绍
#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;
}
然后说一下测试程序中用到的计时函数:
头文件: #include<ctime>
使用方法:定义两个时间点,如 clock_t start,end;
然后分别在需要计时部分前后加上两个函数。
start=clock(); end=clock();
最后再用一个函数就可以计算出来最终的运行时间:
double Cost_time = (double)(finish-start)/CLOCKS_PER_SEC;