时间复杂度
1.概念
渐进时间复杂度(时间复杂度)是算法效率的度量。在一般情况下,算法基本操作重复执行的次数用T(n)表示。同时用一个辅助函数f(n),T(n)/f(n)!=0,那么f(n)是T(n)的同数量级函数,T(n)=O(f(n)),这就称为渐进时间复杂度。
2.大(O)表示法
T(n)=O(f(n))称为大(O)表示法。算法的复杂度可以从最优、最坏、平均三个角度来评估,一般以最坏角度来进行时间复杂度的评估。大(O)表示法的时间复杂度的函数阶一般有以下几种情况,分别是O(1),O(n),O(nx),O(log2n),O(nlog2n)等等。并且如果函数阶里同时出现多种函数组合,则以阶数最大的函数作为时间复杂度。并且如果函数系数非1,则化为1。
3.时间复杂度实例
3.1 常数阶
int sum=0,n=10;//执行1次
sum+=n*(n+1);//执行1次
sum++;//执行1次
cout<<sum;//执行1次
此段代码执行4次,执行次数与n并无关系,所以根据大(O)表示法推导,我们应该将4改为1,即结果都应该为O(1)。
3.2 线性阶
int sum=0;
for(int i=0;i<n;i++){
sum++;
cout<<sum;
}
此段代码是单层循环,运行了n次,所以时间负责度是O(n)。
3.3 对数阶
int num=1;
while(num<n){
num*=2;
}
num初始值为1,不断自乘2逼近n,设循环次数为x,由数学公式2x=n,x=log2n次。
3.4 平方阶
int n=10;
for(int i=0;i<n;i++)
for(int j=10;j>i;j--){
}
}
由上述线性阶的时间复杂度说明容易得知在外层循环中,时间复杂度为O(n),再经过内层循环,两个O(n*n)的结果为O(n2),幂次阶同理。
3.4 阶乘阶
int fac(int n){
cout<<n*fac(n-1);
}
以上代码是一个阶乘函数,顾名思义,为O(n!)。
4.复杂度图表比较
n |
l ogn |
nlogn |
n² |
2ⁿ |
n! |
|
5 |
2 | 10 | 25 | 32 | 120 |
|
10 | 3 | 30 | 100 | 1024 | ||
50 | 5 | 250 | 2500 | 约10^15 |
|
|
100 | 6 | 600 | 10000 | 约10^30 |
约9.3*10^157 |
|
1000 | 9 | 9000 | 1000 000 | 约1 | 约4.0*10^2567 |
常用的时间复杂度按照耗费的时间从小到大依次是:O(1)<O(logn)<O(n)<O(nlogn)<O(n²)<O(n³)<O(2ⁿ)<O(n!)
参考来源:
1.数据结构
2.大话数据结构
约3.0*10^64 |