时间复杂度的概念
一般情况下,算法中基本语句重复执行的次数是问题规模
n
n
n的某个函数
f
(
n
)
f(n)
f(n)算法的时间量度记做
T
(
n
)
=
O
(
f
(
n
)
)
T(n)=O(f(n))
T(n)=O(f(n))
它表示问题规模
n
n
n的增大,算法执行时间的增长率和
f
(
n
)
f(n)
f(n)的增长率相同,称作算法的渐近时间复杂度,简称时间复杂度。
时间复杂度的数学解释
算法的时间复杂度就是未知量
n
n
n在趋近于无穷大时语句执行次数的最大者。
<小歪翻译,不喜勿喷>
几种常见时间复杂度的函数图
时间复杂度的解题方法
对for(i = 0; i < n; i++):起始为零加一次,(大)扩前比后多一次;
一般的:
1.设该语句执行x次终止;
2.找出第x次的表达式;
3.由终止条件x = f(n);
时间复杂度的计算
(408-2019 考研真题)根式阶
1.设 n n n是描述问题规模的非负整数,下列程序段的时间复杂度是
x = 0;
while(n >= (x + 1) * (x + 1))
x = x+1;
A.(log n)
\qquad
B.O(
n
1
/
2
n^{1/2}
n1/2)
\qquad
C.O(n)
\qquad
D.O(
n
2
n^2
n2)
解:对于循环体,我们只考虑小括号内的执行次数。因为小括号内的比较大。按步骤来
1.设小括号的语句执行x次终止
2.第一次:
n
>
0
×
0
n > 0 × 0
n>0×0;
\,\,\,
第二次:
n
>
1
×
1
n > 1 × 1
n>1×1;
\,\,\,\,\,\,
······
第
x
次
\,\,\,\,第x次
第x次:
n
>
x
∗
x
n>x*x
n>x∗x;
3.第x次时终止,即
x
2
x^2
x2<n;
x>
n
1
/
2
n^{1/2}
n1/2
所以x的量级是B。(远大于>>,远小于<<和大于>,小于<是有区别的)
平方阶
int s = 0,i = 0;j = 0;//1
for(i = 0;i < 3 * n + 5;i++)//2
{
for(j = 0; j < 2 * n - 4; j++)//3
{
s = s + j;//4
}
}
求语句1234的执行次数和程序的时间复杂度
解:对语句1,明显只执行1次
\qquad
对语句2,由于是从0开始,所以执行次数加1;即:3n+5次
\qquad
对语句3.由于在循环体中大括号的后面,所以执行少了一次,而它本身要执行2n-4次,所以总体3执行了(3n+5)(2n-3)次;
同理语句4执行了(3n+5)(2n-3)-1次
所以该结构时间复杂度为
O
(
n
2
)
O(n^2)
O(n2)
对数阶,线性阶,阶乘阶
int a = 1;
while(a <= n)//0
{
a = a * 2;
}
int m = 1,n = 0,i = 0;
for(i = 0; i <= n; i++)//1
{
m *= i;
}
for(i = 0; i < m; i++)//2
{
n++;
}
解:语句0:
1.设执行x次终止
2.第一次:1<n;
第二次:2<n;
第三次:22<n;
第三次:22*2<n;
第x次:
2
x
2^x
2x<n;
3.第x次,循环终止,所以
\quad
2
x
2^x
2x>n;
n<
log
2
n
\log_2{n}
log2n
所以时间复杂度为
O
(
l
o
g
n
)
O(log n)
O(logn);
语句1
易知语句1执行了n+2次;(有i<=n再加一次)
时间复杂度为
O
(
n
)
O(n)
O(n)
语句2
\qquad
易知语句2执行了m次;
而语句1中的循环体知m=n!
所以时间复杂度为
O
(
n
!
)
O(n!)
O(n!)
快速看出时间复杂度
其实对于时间复杂度,我们一点也不关心语句执行了多少次,只关心语句执行次数的量级。我们只要知道循环变量i从一直加到n是线性阶,循环体中i成倍增长为对数阶。i在循环体内线性增加,在条件中倍增为根式阶,记住几个特例,就嫩速度知道结果。当然,试着给个口诀。
点增平方根式阶(循环体内+几,比线性增的差的可以说是点增,循环条件平方增加。)
变量线增对数阶(变量线性乘几)