一、时间复杂度
1.简单定义
程序执行时,耗费时间的长度。
查看详细定义
2.方法
对于计算机来说,做加法比做乘除容易得多。因此,在计算时间效率时,加减运算可以忽略不计,基本上就是计算函数有多少次乘除运算。
在上一篇程序运行的时间©“两种算法计算多项式值”一例中涉及到两种算法,我们现在分别计算它们的乘法次数。
- 第一种
double f1(int n, double a[], double x)
{
int i;
double p = a[0];
for (i = 1; i <= n; i++)
p = p + (a[i] * pow(x,i));
return p;
}
pow(x, i) —— (i-1)次乘法;a[i] * pow —— 一次乘法,所以一次循环做了 i 次乘法。循环 n 次,函数乘法执行次数为
1
+
2
+
.
.
.
+
(
n
−
1
)
+
n
1+2+...+(n-1)+n
1+2+...+(n−1)+n既
n
2
+
n
2
\frac{n^2+n}{2}
2n2+n
时间复杂度为 n 的函数,
T
(
n
)
=
C
1
n
2
+
C
2
n
T(n) = C_{1}n^2 + C_{2}n
T(n)=C1n2+C2n
当 n 很大时,可以看作只有n^2在作用。
- 第二种
double f2(int n, double a[], double x)
{
int i;
double p = a[n];
for (i = n; i > 0; i--)
p = a[i-1] + x*p;
return p;
观察发现每轮循环只做一次乘法,因此共做 n 次乘法。
时间复杂度为
T
(
n
)
=
C
.
n
T(n) = C.n
T(n)=C.n
常数具体为多少取决于计算机,因机而异。
3.技巧求解
本周内补充
二、算法效率
分析一般算法效率时,关注两种复杂度。
1.最坏情况复杂度 T w o r s t ( n ) T_{worst}(n) Tworst(n)
2.平均复杂度 T a v g ( n ) T_{avg}(n) Tavg(n)
二者之间的关系总有:
T a v g ( n ) < T w o r s t ( n ) T_{avg}(n) < T_{worst}(n) Tavg(n)<Tworst(n)
通常平均复杂度非常难研究,我们重点关注的是最坏情况复杂度。
三、复杂度的渐进表示法
其实在一个程序中,我们只需明确时间复杂度里的决定因素,就可以粗略知道其增长趋势。例如前面的例子:
当 n 很大时,可以看作只有n^2在作用。
未完待续… …