Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings

Commit b874cb0

Browse files
committed
Update 01.Divide-And-Conquer-Algorithm.md
1 parent d867ff7 commit b874cb0

File tree

1 file changed

+15
-15
lines changed

1 file changed

+15
-15
lines changed

‎Contents/09.Algorithm-Base/03.Divide-And-Conquer-Algorithm/01.Divide-And-Conquer-Algorithm.md

Lines changed: 15 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,19 @@
1010

1111
### 1.2 分治算法和递归算法的异同
1212

13-
从定义上来看,分治算法的思想和之前我们讲过的递归算法的思想是一样的,都是把规模大的问题不断分解为子问题。
13+
从定义上来看,分治算法的思想和递归算法的思想是一样的,都是把规模大的问题不断分解为子问题。
1414

15-
其实,分治算法和递归算法的关系是包含与被包含的关系,可以看做`递归算法 ∈ 分治算法`
15+
其实,分治算法和递归算法的关系是包含与被包含的关系,可以看做:`递归算法 ∈ 分治算法`
1616

1717
分治算法从实现方式上来划分,可以分为两种:「递归算法」和「迭代算法」。
1818

1919
![](https://qcdn.itcharge.cn/images/20220414093828.png)
2020

21-
实际上,分治算法一般都比较适合使用递归算法来实现。但除了递归算法之外,分治算法还可以通过迭代算法来实现。比较常见的例子有:快速傅里叶变换算法、二分查找算法、非递归实现的归并排序算法等等。
21+
分治算法一般都比较适合使用递归算法来实现。但除了递归算法之外,分治算法还可以通过迭代算法来实现。比较常见的例子有:快速傅里叶变换算法、二分查找算法、非递归实现的归并排序算法等等。
2222

2323
### 1.3 分治算法的适用条件
2424

25-
分治算法能够解决的问题,一般需要满足以下 `4` 个条件:
25+
分治算法能够解决的问题,一般需要满足以下 4ドル$ 个条件:
2626

2727
1. 原问题可以分解为若干个规模较小的相同子问题。
2828
2. 分解出来的子问题可以独立求解,即子问题之间不包含公共的子子问题。
@@ -31,19 +31,19 @@
3131

3232
## 2. 分治算法的基本步骤
3333

34-
使用分治算法解决问题主要分为 `3` 个步骤:
34+
使用分治算法解决问题主要分为 3ドル$ 个步骤:
3535

3636
1. **分解**:把要解决的问题分解为成若干个规模较小、相对独立、与原问题形式相同的子问题。
3737
2. **求解**:递归求解各个子问题。
3838
3. **合并**:按照原问题的要求,将子问题的解逐层合并构成原问题的解。
3939

40-
其中第 `1` 步中将问题分解为若干个子问题时,最好使子问题的规模大致相同。换句话说,将一个问题分成大小相等的 `k` 个子问题的处理方法是行之有效的。在许多问题中,可以取 `k = s2`。这种使子问题规模大致相等的做法是出自一种平衡子问题的思想,它几乎总是比子问题规模不等的做法要好。
40+
其中第 1ドル$ 步中将问题分解为若干个子问题时,最好使子问题的规模大致相同。换句话说,将一个问题分成大小相等的 $k$ 个子问题的处理方法是行之有效的。在许多问题中,可以取 $k = 2$。这种使子问题规模大致相等的做法是出自一种平衡子问题的思想,它几乎总是比子问题规模不等的做法要好。
4141

42-
其中第 `2` 步的「递归求解各个子问题」指的是按照同样的分治策略进行求解,即通过将这些子问题分解为更小的子子问题来进行求解。就这样一直分解下去,直到分解出来的子问题简单到只用常数操作时间即可解决为止。
42+
其中第 2ドル$ 步的「递归求解各个子问题」指的是按照同样的分治策略进行求解,即通过将这些子问题分解为更小的子子问题来进行求解。就这样一直分解下去,直到分解出来的子问题简单到只用常数操作时间即可解决为止。
4343

44-
在完成第 `2` 步之后,最小子问题的解可用常数时间求得。然后我们再按照递归算法中回归过程的顺序,由底至上地将子问题的解合并起来,逐级上推就构成了原问题的解。
44+
在完成第 2ドル$ 步之后,最小子问题的解可用常数时间求得。然后我们再按照递归算法中回归过程的顺序,由底至上地将子问题的解合并起来,逐级上推就构成了原问题的解。
4545

46-
按照分而治之的策略,在编写分治算法的代码时,也是按照上面的 `3` 个步骤来编写的,其对应的伪代码如下:
46+
按照分而治之的策略,在编写分治算法的代码时,也是按照上面的 3ドル$ 个步骤来编写的,其对应的伪代码如下:
4747

4848
```Python
4949
def divide_and_conquer(problem): # problem 为问题规模
@@ -142,8 +142,8 @@ $T(n) = \begin{cases} \begin{array} \ O{(1)} & n = 1 \cr 2T(n/2) + O(n) & n > 1
142142

143143
我们使用归并排序算法来解决这道题。
144144

145-
1. **分解**:将待排序序列中的 `n` 个元素分解为左右两个各包含 `n / 2` 个元素的子序列。
146-
2. **求解**:递归将子序列进行分解和排序,直到所有子序列长度为 `1`
145+
1. **分解**:将待排序序列中的 $n$ 个元素分解为左右两个各包含 $\frac{n}{2}$ 个元素的子序列。
146+
2. **求解**:递归将子序列进行分解和排序,直到所有子序列长度为 1ドル$
147147
3. **合并**:把当前序列组中有序子序列逐层向上,进行两两合并。
148148

149149
使用归并排序算法对数组排序的过程如下图所示。
@@ -189,14 +189,14 @@ class Solution:
189189

190190
#### 4.2.2 题目大意
191191

192-
**描述**:给定一个含有 `n` 个元素有序的(升序)整型数组 `nums` 和一个目标值 `target`
192+
**描述**:给定一个含有 $n$ 个元素有序的(升序)整型数组 `nums` 和一个目标值 `target`
193193

194-
**要求**:返回 `target` 在数组 `nums` 中的位置,如果找不到,则返回 `-1`
194+
**要求**:返回 `target` 在数组 `nums` 中的位置,如果找不到,则返回 $-1$
195195

196196
**说明**:
197197

198198
- 假设 `nums` 中的所有元素是不重复的。
199-
- `n` 将在 `[1, 10000]`之间。
199+
- $n$ 将在 $[1, 10000]$ 之间。
200200
- $-9999 \le nums[i] \le 9999$。
201201

202202
**示例**:
@@ -211,7 +211,7 @@ class Solution:
211211

212212
我们使用分治算法来解决这道题。与其他分治题目不一样的地方是二分查找不用进行合并过程,最小子问题的解就是原问题的解。
213213

214-
1. **分解**:将数组的 `n` 个元素分解为左右两个各包含 `n / 2` 个元素的子序列。
214+
1. **分解**:将数组的 $n$ 个元素分解为左右两个各包含 $\frac{n}{2}$ 个元素的子序列。
215215
2. **求解**:取中间元素 `nums[mid]``target` 相比。
216216
1. 如果相等,则找到该元素;
217217
2. 如果 `nums[mid] < target`,则递归在左子序列中进行二分查找。

0 commit comments

Comments
(0)

AltStyle によって変換されたページ (->オリジナル) /