This commit is contained in:
krahets
2023-02-24 18:45:27 +08:00
parent 8f74aa1fad
commit ed43cdf179
44 changed files with 168 additions and 168 deletions
@@ -2,9 +2,9 @@
comments: true
---
# 2.2. 时间复杂度
# 2.2.   时间复杂度
## 2.2.1. 统计算法运行时间
## 2.2.1.   统计算法运行时间
运行时间能够直观且准确地体现出算法的效率水平。如果我们想要 **准确预估一段代码的运行时间** ,该如何做呢?
@@ -161,7 +161,7 @@ $$
但实际上, **统计算法的运行时间既不合理也不现实**。首先,我们不希望预估时间和运行平台绑定,毕竟算法需要跑在各式各样的平台之上。其次,我们很难获知每一种操作的运行时间,这为预估过程带来了极大的难度。
## 2.2.2. 统计时间增长趋势
## 2.2.2.   统计时间增长趋势
「时间复杂度分析」采取了不同的做法,其统计的不是算法运行时间,而是 **算法运行时间随着数据量变大时的增长趋势** 。
@@ -381,7 +381,7 @@ $$
**时间复杂度也存在一定的局限性**。比如,虽然算法 `A` 和 `C` 的时间复杂度相同,但是实际的运行时间有非常大的差别。再比如,虽然算法 `B` 比 `C` 的时间复杂度要更高,但在输入数据大小 $n$ 比较小时,算法 `B` 是要明显优于算法 `C` 的。对于以上情况,我们很难仅凭时间复杂度来判定算法效率高低。然而,即使存在这些问题,计算复杂度仍然是评判算法效率的最有效且常用的方法。
## 2.2.3. 函数渐近上界
## 2.2.3.   函数渐近上界
设算法「计算操作数量」为 $T(n)$ ,其是一个关于输入数据大小 $n$ 的函数。例如,以下算法的操作数量为
@@ -548,7 +548,7 @@ $T(n)$ 是个一次函数,说明时间增长趋势是线性的,因此易得
渐近上界的数学味儿有点重,如果你感觉没有完全理解,无需担心,因为在实际使用中我们只需要会推算即可,数学意义可以慢慢领悟。
## 2.2.4. 推算方法
## 2.2.4.   推算方法
推算出 $f(n)$ 后,我们就得到时间复杂度 $O(f(n))$ 。那么,如何来确定渐近上界 $f(n)$ 呢?总体分为两步,首先「统计操作数量」,然后「判断渐近上界」。
@@ -767,7 +767,7 @@ $$
</div>
## 2.2.5. 常见类型
## 2.2.5. &nbsp; 常见类型
设输入数据大小为 $n$ ,常见的时间复杂度类型有(从低到高排列)
@@ -2407,7 +2407,7 @@ $$
<p align="center"> Fig. 阶乘阶的时间复杂度 </p>
## 2.2.6. 最差、最佳、平均时间复杂度
## 2.2.6. &nbsp; 最差、最佳、平均时间复杂度
**某些算法的时间复杂度不是恒定的,而是与输入数据的分布有关**。举一个例子,输入一个长度为 $n$ 数组 `nums` ,其中 `nums` 由从 $1$ 至 $n$ 的数字组成,但元素顺序是随机打乱的;算法的任务是返回元素 $1$ 的索引。我们可以得出以下结论: