mirror of
https://github.com/krahets/hello-algo.git
synced 2026-07-09 22:16:06 +00:00
build
This commit is contained in:
@@ -26,6 +26,8 @@ comments: true
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 算法使用的相关空间 </p>
|
||||
|
||||
=== "Java"
|
||||
|
||||
```java title=""
|
||||
@@ -565,6 +567,8 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 空间复杂度的常见类型 </p>
|
||||
|
||||
!!! tip
|
||||
|
||||
部分示例代码需要一些前置知识,包括数组、链表、二叉树、递归算法等。如果遇到看不懂的地方无需担心,可以在学习完后面章节后再来复习,现阶段先聚焦在理解空间复杂度含义和推算方法上。
|
||||
@@ -1078,6 +1082,8 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 递归函数产生的线性阶空间复杂度 </p>
|
||||
|
||||
### 平方阶 $O(n^2)$
|
||||
|
||||
平方阶常见于元素数量与 $n$ 成平方关系的矩阵、图。
|
||||
@@ -1362,6 +1368,8 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 递归函数产生的平方阶空间复杂度 </p>
|
||||
|
||||
### 指数阶 $O(2^n)$
|
||||
|
||||
指数阶常见于二叉树。高度为 $n$ 的「满二叉树」的结点数量为 $2^n - 1$ ,使用 $O(2^n)$ 空间。
|
||||
@@ -1496,6 +1504,8 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 满二叉树产生的指数阶空间复杂度 </p>
|
||||
|
||||
### 对数阶 $O(\log n)$
|
||||
|
||||
对数阶常见于分治算法、数据类型转换等。
|
||||
|
||||
@@ -371,6 +371,8 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 算法 A, B, C 的时间增长趋势 </p>
|
||||
|
||||
相比直接统计算法运行时间,时间复杂度分析的做法有什么好处呢?以及有什么不足?
|
||||
|
||||
**时间复杂度可以有效评估算法效率**。算法 `B` 运行时间的增长是线性的,在 $n > 1$ 时慢于算法 `A` ,在 $n > 1000000$ 时慢于算法 `C` 。实质上,只要输入数据大小 $n$ 足够大,复杂度为「常数阶」的算法一定优于「线性阶」的算法,这也正是时间增长趋势的含义。
|
||||
@@ -538,6 +540,8 @@ $T(n)$ 是个一次函数,说明时间增长趋势是线性的,因此易得
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 函数的渐近上界 </p>
|
||||
|
||||
本质上看,计算渐近上界就是在找一个函数 $f(n)$ ,**使得在 $n$ 趋向于无穷大时,$T(n)$ 和 $f(n)$ 处于相同的增长级别(仅相差一个常数项 $c$ 的倍数)**。
|
||||
|
||||
!!! tip
|
||||
@@ -776,6 +780,8 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 时间复杂度的常见类型 </p>
|
||||
|
||||
!!! tip
|
||||
|
||||
部分示例代码需要一些前置知识,包括数组、递归算法等。如果遇到看不懂的地方无需担心,可以在学习完后面章节后再来复习,现阶段先聚焦在理解时间复杂度含义和推算方法上。
|
||||
@@ -1328,6 +1334,8 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 常数阶、线性阶、平方阶的时间复杂度 </p>
|
||||
|
||||
以「冒泡排序」为例,外层循环 $n - 1$ 次,内层循环 $n-1, n-2, \cdots, 2, 1$ 次,平均为 $\frac{n}{2}$ 次,因此时间复杂度为 $O(n^2)$ 。
|
||||
|
||||
$$
|
||||
@@ -1733,6 +1741,8 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 指数阶的时间复杂度 </p>
|
||||
|
||||
在实际算法中,指数阶常出现于递归函数。例如以下代码,不断地一分为二,分裂 $n$ 次后停止。
|
||||
|
||||
=== "Java"
|
||||
@@ -1980,6 +1990,8 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 对数阶的时间复杂度 </p>
|
||||
|
||||
与指数阶类似,对数阶也常出现于递归函数。以下代码形成了一个高度为 $\log_2 n$ 的递归树。
|
||||
|
||||
=== "Java"
|
||||
@@ -2233,6 +2245,8 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 线性对数阶的时间复杂度 </p>
|
||||
|
||||
### 阶乘阶 $O(n!)$
|
||||
|
||||
阶乘阶对应数学上的「全排列」。即给定 $n$ 个互不重复的元素,求其所有可能的排列方案,则方案数量为
|
||||
@@ -2391,6 +2405,8 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> Fig. 阶乘阶的时间复杂度 </p>
|
||||
|
||||
## 2.2.6. 最差、最佳、平均时间复杂度
|
||||
|
||||
**某些算法的时间复杂度不是恒定的,而是与输入数据的分布有关**。举一个例子,输入一个长度为 $n$ 数组 `nums` ,其中 `nums` 由从 $1$ 至 $n$ 的数字组成,但元素顺序是随机打乱的;算法的任务是返回元素 $1$ 的索引。我们可以得出以下结论:
|
||||
|
||||
Reference in New Issue
Block a user