Skip to content

Commit 6f29359

Browse files
committed
简单更新
1 parent 6e92343 commit 6f29359

1 file changed

Lines changed: 32 additions & 3 deletions

File tree

src/foundation/asymptotics/symbol.md

Lines changed: 32 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,16 +56,41 @@ $$
5656
上面的仅作为例子,对于任意二次函数的证明可以参考[练习与回答](#练习与回答)
5757

5858
照这样,我们也可以把其他的记号都定义出来:
59-
6059
## $O$ 记号
61-
$O$ 记号在历史上出现的最早,也最为常用(因为不需要像$\Theta$同时保证一个下界,因此更方便无需更复杂的数学证明)。
60+
$O$ 记号在历史上出现的最早,也最为常用(因为不需要像$\Theta$同时保证一个下界,因此无需更复杂的数学证明)。
6261
$$
6362
O(g(n)) = \{ f(x) | \exists c > 0, \exists n_0 \in \mathbb{N}, \forall n \geq n_0, \, |f(n)| \leq c \cdot |g(n)| \}
6463
$$
6564

6665
在定义下一个记号之前让我们先缓一下,在[二分查找](/foundation/algorithm/binary_search.md)一节中我们提到了下面这个问题:
6766

68-
在上述算法中,插入排序可以在$\Theta(n k)$时间内排序每个长度为$k$的$n / k$个子表(每个子表排序的时间复杂度为$\Theta(k ^ 2)$,故$T(n) = \Theta(k ^ 2) \cdot (n / k) = \Theta(n k)$)。同样不难看出,合并子表的时间复杂度是$\Theta(n \log (n / k))$,综上就有该算法最坏情况下的时间复杂度为$\Theta(n k + n \log (n / k))$。为了确保任何$k$的取值不能使修改后算法时间复杂度高于原算法,$k = O(\log n)$。
67+
> 在上述算法中,插入排序可以在$\Theta(n k)$时间内排序每个长度为$k$的$n / k$个子表(每个子表排序的时间复杂度为$\Theta(k ^ 2)$,故$T(n) = \Theta(k ^ 2) \cdot (n / k) = \Theta(n k)$)。同样不难看出,合并子表的时间复杂度是$\Theta(n \log (n / k))$,综上就有该算法最坏情况下的时间复杂度为$\Theta(n k + n \log (n / k))$。为了确保任何$k$的取值不能使修改后算法时间复杂度高于原算法,$k = O(\log n)$。
68+
69+
让我们来尝试证明它: 这里的核心部分是: 对于$\Theta(n k + n \log (n / k))$,若$\Theta(n k + n \log (n / k)) \leq \Theta(n \log n)$[^note1],试求$k$的取值。
70+
71+
首先观察$\leq \Theta(n \log n)$,说明$n k + n \log (n / k)$的渐进增长率[^note2]不超过$n \log n$,应用我们刚刚所学的$O$符号就可以把不等式转换成:
72+
$$
73+
n k + n \log (n / k) = O(n \log n)
74+
$$
75+
76+
我们需要展示存在常数$c > 0$和$n_0$,使得对于所有 $n \geq n_0$,有:
77+
$$
78+
n k + n \log \left( \frac{n}{k} \right) \leq c \cdot n \log n
79+
$$
80+
81+
两边同时除以$n$(假设 $n > 0$):
82+
$$
83+
k + \log \left( \frac{n}{k} \right) \leq c \log n
84+
$$
85+
86+
展开 $\log \left( \frac{n}{k} \right) = \log n - \log k$并变形得:
87+
$$
88+
k - \log k \leq (c - 1) \log n
89+
$$
90+
91+
为了对于所有的$n$,上面表达式都成立,我们需要考虑两种情况:
92+
1. $k$为常数
93+
6994

7095
> [!WARNING]
7196
> 该章节仍在编写,欢迎在 [GitHub仓库](https://github.com/TickPoints/algorithm_learning) 提交PR贡献内容。
@@ -74,3 +99,7 @@ $$
7499
## 练习与回答
75100
> [!WARNING]
76101
> 该章节仍在编写,欢迎在 [GitHub仓库](https://github.com/TickPoints/algorithm_learning) 提交PR贡献内容。
102+
103+
[^note1]: 与等号的非形式化运用相似,这里是对于渐近符号的不等式非形式化运用。此处严格可表示为: $\Theta(n k + n \log (n / k)) \subseteq \Theta(n \log n)$
104+
105+
[^note2]: **渐进增长率(Asymptotic Growth Rate)** 是计算机科学和数学中用于描述函数在输入规模$n$趋近于无穷大时的增长趋势的一种工具。可以简单理解为渐进增长率就是一个函数渐近分析后的结果。

0 commit comments

Comments
 (0)