mirror of
https://github.com/krahets/hello-algo.git
synced 2026-08-16 05:30:59 +00:00
build
This commit is contained in:
@@ -10,14 +10,14 @@ status: new
|
||||
1. **分(划分阶段)**:递归地将原问题分解为两个或多个子问题,直至到达最小子问题时终止。
|
||||
2. **治(合并阶段)**:从已知解的最小子问题开始,从底至顶地将子问题的解进行合并,从而构建出原问题的解。
|
||||
|
||||
如下图所示,“归并排序”是分治策略的典型应用之一,其算法原理为:
|
||||
如图 12-1 所示,“归并排序”是分治策略的典型应用之一,其算法原理为:
|
||||
|
||||
1. **分**:递归地将原数组(原问题)划分为两个子数组(子问题),直到子数组只剩一个元素(最小子问题)。
|
||||
2. **治**:从底至顶地将有序的子数组(子问题的解)进行合并,从而得到有序的原数组(原问题的解)。
|
||||
|
||||

|
||||
|
||||
<p align="center"> 图:归并排序的分治策略 </p>
|
||||
<p align="center"> 图 12-1 归并排序的分治策略 </p>
|
||||
|
||||
## 12.1.1 如何判断分治问题
|
||||
|
||||
@@ -41,7 +41,7 @@ status: new
|
||||
|
||||
### 1. 操作数量优化
|
||||
|
||||
以“冒泡排序”为例,其处理一个长度为 $n$ 的数组需要 $O(n^2)$ 时间。假设我们按照下图所示的方式,将数组从中点分为两个子数组,则划分需要 $O(n)$ 时间,排序每个子数组需要 $O((n / 2)^2)$ 时间,合并两个子数组需要 $O(n)$ 时间,总体时间复杂度为:
|
||||
以“冒泡排序”为例,其处理一个长度为 $n$ 的数组需要 $O(n^2)$ 时间。假设我们按照图 12-2 所示的方式,将数组从中点分为两个子数组,则划分需要 $O(n)$ 时间,排序每个子数组需要 $O((n / 2)^2)$ 时间,合并两个子数组需要 $O(n)$ 时间,总体时间复杂度为:
|
||||
|
||||
$$
|
||||
O(n + (\frac{n}{2})^2 \times 2 + n) = O(\frac{n^2}{2} + 2n)
|
||||
@@ -49,7 +49,7 @@ $$
|
||||
|
||||

|
||||
|
||||
<p align="center"> 图:划分数组前后的冒泡排序 </p>
|
||||
<p align="center"> 图 12-2 划分数组前后的冒泡排序 </p>
|
||||
|
||||
接下来,我们计算以下不等式,其左边和右边分别为划分前和划分后的操作总数:
|
||||
|
||||
@@ -73,11 +73,11 @@ $$
|
||||
|
||||
并行优化在多核或多处理器的环境中尤其有效,因为系统可以同时处理多个子问题,更加充分地利用计算资源,从而显著减少总体的运行时间。
|
||||
|
||||
比如在下图所示的“桶排序”中,我们将海量的数据平均分配到各个桶中,则可所有桶的排序任务分散到各个计算单元,完成后再进行结果合并。
|
||||
比如在图 12-3 所示的“桶排序”中,我们将海量的数据平均分配到各个桶中,则可所有桶的排序任务分散到各个计算单元,完成后再进行结果合并。
|
||||
|
||||

|
||||
|
||||
<p align="center"> 图:桶排序的并行计算 </p>
|
||||
<p align="center"> 图 12-3 桶排序的并行计算 </p>
|
||||
|
||||
## 12.1.3 分治常见应用
|
||||
|
||||
|
||||
Reference in New Issue
Block a user