Skip to content

Commit c67a817

Browse files
committed
2 parents 570ab4b + 46bb96c commit c67a817

File tree

2 files changed

+7
-7
lines changed

2 files changed

+7
-7
lines changed

docs/ch01/01.01/01.01.02-Algorithm-Complexity.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -51,9 +51,9 @@ def algorithm(n):
5151
return fact
5252
```
5353

54-
把上述算法中所有语句的执行次数加起来 $1 + n + n + 1 = 2n + 2$,可以用一个函数 $f(n)$ 来表达语句的执行次数:$f(n) = 2n + 2$。
54+
把上述算法中所有语句的执行次数加起来 $1 + n + n + 1 = 2 \times n + 2$,可以用一个函数 $f(n)$ 来表达语句的执行次数:$f(n) = 2 \times n + 2$。
5555

56-
则时间复杂度的函数可以表示为:$T(n) = O(f(n))$。它表示的是随着问题规模 n 的增大,算法执行时间的增长趋势跟 $f(n)$ 相同。$O$ 是一种渐进符号,$T(n)$ 称作算法的 **渐进时间复杂度(Asymptotic Time Complexity)**,简称为 **时间复杂度**
56+
则时间复杂度的函数可以表示为:$T(n) = O(f(n))$。它表示的是随着问题规模 $n$ 的增大,算法执行时间的增长趋势跟 $f(n)$ 相同。$O$ 是一种渐进符号,$T(n)$ 称作算法的 **渐进时间复杂度(Asymptotic Time Complexity)**,简称为 **时间复杂度**
5757

5858
所谓「算法执行时间的增长趋势」是一个模糊的概念,通常我们要借助像上边公式中 $O$ 这样的「渐进符号」来表示时间复杂度。
5959

@@ -173,7 +173,7 @@ def permutations(arr, start, end):
173173
arr[i], arr[start] = arr[start], arr[i]
174174
```
175175

176-
上述代码中实现「全排列」使用了递归的方法。假设数组 $arr$ 长度为 $n$,第一层 `for` 循环执行了 $n$ 次,第二层 `for` 循环执行了 $n - 1$ 次。以此类推,最后一层 `for` 循环执行了 $1$ 次,将所有层 `for` 循环的执行次数累乘起来为 $n \times (n - 1) \times (n - 2) \times … \times 2 \times 1 = n!$ 次。则整个算法的 `for` 循环中基本语句的执行次数为 $n!$ 次,所以对应时间复杂度为 $O(n!)$。
176+
上述代码中实现「全排列」使用了递归的方法。假设数组 $arr$ 长度为 $n$,第一层 for 循环执行了 $n$ 次,第二层 for 循环执行了 $n - 1$ 次。以此类推,最后一层 for 循环执行了 $1$ 次,将所有层 for 循环的执行次数累乘起来为 $n \times (n - 1) \times (n - 2) \times … \times 2 \times 1 = n!$ 次。则整个算法的 for 循环中基本语句的执行次数为 $n!$ 次,所以对应时间复杂度为 $O(n!)$。
177177

178178
#### 2.3.5 对数 $O(\log n)$
179179

@@ -232,15 +232,15 @@ def find(nums, val):
232232
return pos
233233
```
234234

235-
这段代码要实现的功能是:从一个整数数组 $nums$ 中查找值为 $val$ 的变量出现的位置。如果不考虑 `break` 语句,根据「2.3 时间复杂度计算」中讲的分析步骤,这个算法的时间复杂度是 $O(n)$,其中 $n$ 代表数组的长度。
235+
这段代码要实现的功能是:从一个整数数组 $nums$ 中查找值为 $val$ 的变量出现的位置。如果不考虑 break 语句,根据「2.3 时间复杂度计算」中讲的分析步骤,这个算法的时间复杂度是 $O(n)$,其中 $n$ 代表数组的长度。
236236

237-
但是如果考虑 `break` 语句,那么就需要考虑输入的内容了。如果数组中第 $1$ 个元素值就是 $val$,那么剩下 $n - 1$ 个数据都不要遍历了,那么时间复杂度就是 $O(1)$,即最佳时间复杂度为 $O(1)$。如果数组中不存在值为 $val$ 的变量,那么就需要把整个数组遍历一遍,时间复杂度就变成了 $O(n)$,即最差时间复杂度为 $O(n)$。
237+
但是如果考虑 break 语句,那么就需要考虑输入的内容了。如果数组中第 $1$ 个元素值就是 $val$,那么剩下 $n - 1$ 个数据都不要遍历了,那么时间复杂度就是 $O(1)$,即最佳时间复杂度为 $O(1)$。如果数组中不存在值为 $val$ 的变量,那么就需要把整个数组遍历一遍,时间复杂度就变成了 $O(n)$,即最差时间复杂度为 $O(n)$。
238238

239239
这样下来,时间复杂度就不唯一了。怎么办?
240240

241241
我们都知道,最佳时间复杂度和最坏时间复杂度都是极端条件下的时间复杂度,发生的概率其实很小。为了能更好的表示正常情况下的复杂度,所以我们一般采用平均时间复杂度作为时间复杂度的计算方式。
242242

243-
还是刚才的例子,在数组 $nums$ 中查找变量值为 $val$ 的位置,总共有 $n + 1$ 种情况:「在数组的的 $0 \sim n - 1$ 个位置上」和「不在数组中」。我们将所有情况下,需要执行的语句次数累加起来,再除以 $n + 1$,就可以得到平均需要执行的语句次数,即:$\frac{1 + 2 + 3 + ... + n + n}{n + 1} = \frac{n(n + 3)}{2(n + 1)}$。将公式简化后,得到的平均时间复杂度就是 $O(n)$。
243+
还是刚才的例子,在数组 $nums$ 中查找变量值为 $val$ 的位置,总共有 $n + 1$ 种情况:「在数组的的 $0 \sim n - 1$ 个位置上」和「不在数组中」。我们将所有情况下,需要执行的语句次数累加起来,再除以 $n + 1$,就可以得到平均需要执行的语句次数,即:$\frac{1 + 2 + 3 + ... + n + n}{n + 1} = \frac{n \times (n + 3)}{2 \times (n + 1)}$。将公式简化后,得到的平均时间复杂度就是 $O(n)$。
244244

245245
通常只有同一个算法在输入内容不同,不同时间复杂度有量级的差距时,我们才会通过三种时间复杂度表示法来区分。一般情况下,使用其中一种就可以满足需求了。
246246

docs/ch01/01.01/01.01.03-LeetCode-Guide.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ class Solution:
148148

149149
##### 思路 2:哈希表
150150

151-
哈希表中键值对信息为 $target-nums[i] :i,其中 $i$ 为下标。
151+
哈希表中键值对信息为 $target - nums[i]: i$,其中 $i$ 为下标。
152152

153153
1. 遍历数组,对于每一个数 $nums[i]$:
154154
1. 先查找字典中是否存在 $target - nums[i]$,存在则输出 $target - nums[i]$ 对应的下标和当前数组的下标 $i$。

0 commit comments

Comments
 (0)