mirror of
https://github.com/krahets/hello-algo.git
synced 2025-11-02 21:24:53 +08:00
Update the captions of all the figures.
This commit is contained in:
@ -20,9 +20,7 @@
|
||||
- 「栈帧空间」用于保存调用函数的上下文数据。系统每次调用函数都会在栈的顶部创建一个栈帧,函数返回时,栈帧空间会被释放。
|
||||
- 「指令空间」用于保存编译后的程序指令,**在实际统计中一般忽略不计**。
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 算法使用的相关空间 </p>
|
||||

|
||||
|
||||
=== "Java"
|
||||
|
||||
@ -561,9 +559,7 @@ O(1) < O(\log n) < O(n) < O(n^2) < O(2^n) \newline
|
||||
\end{aligned}
|
||||
$$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 空间复杂度的常见类型 </p>
|
||||

|
||||
|
||||
!!! tip
|
||||
|
||||
@ -761,9 +757,7 @@ $$
|
||||
[class]{}-[func]{linearRecur}
|
||||
```
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 递归函数产生的线性阶空间复杂度 </p>
|
||||

|
||||
|
||||
### 平方阶 $O(n^2)$
|
||||
|
||||
@ -891,9 +885,7 @@ $$
|
||||
[class]{}-[func]{quadraticRecur}
|
||||
```
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 递归函数产生的平方阶空间复杂度 </p>
|
||||

|
||||
|
||||
### 指数阶 $O(2^n)$
|
||||
|
||||
@ -959,9 +951,7 @@ $$
|
||||
[class]{}-[func]{buildTree}
|
||||
```
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 满二叉树下的指数阶空间复杂度 </p>
|
||||

|
||||
|
||||
### 对数阶 $O(\log n)$
|
||||
|
||||
|
||||
@ -365,9 +365,7 @@ $$
|
||||
|
||||
```
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 算法 A, B, C 的时间增长趋势 </p>
|
||||

|
||||
|
||||
相比直接统计算法运行时间,时间复杂度分析的做法有什么好处呢?以及有什么不足?
|
||||
|
||||
@ -534,9 +532,7 @@ $T(n)$ 是个一次函数,说明时间增长趋势是线性的,因此易得
|
||||
T(n) = O(f(n))
|
||||
$$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 函数的渐近上界 </p>
|
||||

|
||||
|
||||
本质上看,计算渐近上界就是在找一个函数 $f(n)$ ,**使得在 $n$ 趋向于无穷大时,$T(n)$ 和 $f(n)$ 处于相同的增长级别(仅相差一个常数项 $c$ 的倍数)**。
|
||||
|
||||
@ -774,9 +770,7 @@ O(1) < O(\log n) < O(n) < O(n \log n) < O(n^2) < O(2^n) < O(n!) \newline
|
||||
\end{aligned}
|
||||
$$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 时间复杂度的常见类型 </p>
|
||||

|
||||
|
||||
!!! tip
|
||||
|
||||
@ -1042,9 +1036,7 @@ $$
|
||||
[class]{}-[func]{quadratic}
|
||||
```
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 常数阶、线性阶、平方阶的时间复杂度 </p>
|
||||

|
||||
|
||||
以「冒泡排序」为例,外层循环 $n - 1$ 次,内层循环 $n-1, n-2, \cdots, 2, 1$ 次,平均为 $\frac{n}{2}$ 次,因此时间复杂度为 $O(n^2)$ 。
|
||||
|
||||
@ -1180,9 +1172,7 @@ $$
|
||||
[class]{}-[func]{exponential}
|
||||
```
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 指数阶的时间复杂度 </p>
|
||||

|
||||
|
||||
在实际算法中,指数阶常出现于递归函数。例如以下代码,不断地一分为二,分裂 $n$ 次后停止。
|
||||
|
||||
@ -1314,9 +1304,7 @@ $$
|
||||
[class]{}-[func]{logarithmic}
|
||||
```
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 对数阶的时间复杂度 </p>
|
||||

|
||||
|
||||
与指数阶类似,对数阶也常出现于递归函数。以下代码形成了一个高度为 $\log_2 n$ 的递归树。
|
||||
|
||||
@ -1446,9 +1434,7 @@ $$
|
||||
[class]{}-[func]{linearLogRecur}
|
||||
```
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 线性对数阶的时间复杂度 </p>
|
||||

|
||||
|
||||
### 阶乘阶 $O(n!)$
|
||||
|
||||
@ -1520,9 +1506,7 @@ $$
|
||||
[class]{}-[func]{factorialRecur}
|
||||
```
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 阶乘阶的时间复杂度 </p>
|
||||

|
||||
|
||||
## 最差、最佳、平均时间复杂度
|
||||
|
||||
|
||||
Reference in New Issue
Block a user