66
77简单来说,分治算法的基本思想就是: ** 把规模大的问题不断分解为子问题,使得问题规模减小到可以直接求解为止。**
88
9- ![ ] ( https://qcdn.itcharge.cn/images/20220413153059.png )
9+ ![ 分治算法的基本思想 ] ( https://qcdn.itcharge.cn/images/20220413153059.png )
1010
1111### 1.2 分治算法和递归算法的异同
1212
1616
1717分治算法从实现方式上来划分,可以分为两种:「递归算法」和「迭代算法」。
1818
19- ![ ] ( https://qcdn.itcharge.cn/images/20220414093828 .png )
19+ ![ 分治算法的实现方式 ] ( https://qcdn.itcharge.cn/images/20240513162133 .png )
2020
2121一般情况下,分治算法比较适合使用递归算法来实现。但除了递归算法之外,分治算法还可以通过迭代算法来实现。比较常见的例子有:快速傅里叶变换算法、二分查找算法、非递归实现的归并排序算法等等。
2222
@@ -68,7 +68,7 @@ def divide_and_conquer(problems_n): # problems_n 为问题规模
6868
6969一般来讲,分治算法将一个问题划分为 $a$ 个形式相同的子问题,每个子问题的规模为 $n/b$,则总的时间复杂度的递归表达式可以表示为:
7070
71- $T(n) = \begin{cases} \begin{array} \ \ Theta{(1)} & n = 1 \cr a \times T(n/b) + f(n) & n > 1 \end{array} \end{cases}$
71+ $T(n) = \begin{cases} \Theta{(1)} & n = 1 \cr a \times T(n/b) + f(n) & n > 1 \end{cases}$
7272
7373其中,每次分解时产生的子问题个数是 $a$ ,每个子问题的规模是原问题规模的 $1 / b$,分解和合并 $a$ 个子问题的时间复杂度是 $f(n)$。
7474
@@ -82,15 +82,15 @@ $T(n) = \begin{cases} \begin{array} \ \Theta{(1)} & n = 1 \cr a \times T(n/b) +
8282
8383我们得出归并排序算法的递归表达式如下:
8484
85- $T(n) = \begin{cases} \begin{array} \ O{(1)} & n = 1 \cr 2 \times T(n/2) + O(n) & n > 1 \end{array} \end{cases}$
85+ $T(n) = \begin{cases} O{(1)} & n = 1 \cr 2 \times T(n/2) + O(n) & n > 1 \end{cases}$
8686
8787根据归并排序的递归表达式,当 $n > 1$ 时,可以递推求解:
8888
89- $\begin{align } T(n) & = 2 \times T(n/2) + O(n) \cr & = 2 \times (2 \times T(n / 4) + O(n/2)) + O(n) \cr & = 4 \times T(n/4) + 2 \times O(n) \cr & = 8 \times T(n/8) + 3 \times O(n) \cr & = …… \cr & = 2^x \times T(n/2^x) + x \times O(n) \end{align} $
89+ $$ \begin{aligned } T(n) & = 2 \times T(n/2) + O(n) \cr & = 2 \times (2 \times T(n / 4) + O(n/2)) + O(n) \cr & = 4 \times T(n/4) + 2 \times O(n) \cr & = 8 \times T(n/8) + 3 \times O(n) \cr & = …… \cr & = 2^x \times T(n/2^x) + x \times O(n) \end{aligned} $ $
9090
9191递推最终规模为 $1$,令 $n = 2^x$,则 $x = \log_2n$,则:
9292
93- $\begin{align } T(n) & = n \times T(1) + \log_2n \times O(n) \cr & = n + \log_2n \times O(n) \cr & = O(n \times \log_2n) \end{align} $
93+ $$ \begin{aligned } T(n) & = n \times T(1) + \log_2n \times O(n) \cr & = n + \log_2n \times O(n) \cr & = O(n \times \log_2n) \end{aligned} $ $
9494
9595则归并排序的时间复杂度为 $O(n \times \log_2n)$。
9696
@@ -106,13 +106,13 @@ $\text{时间复杂度} = \text{叶子数} \times T(1) + \text{成本和} = 2^x
106106
107107归并排序算法的递归表达式如下:
108108
109- $T(n) = \begin{cases} \begin{array} \ O{(1)} & n = 1 \cr 2T(n/2) + O(n) & n > 1 \end{array} \end{cases}$
109+ $T(n) = \begin{cases} O{(1)} & n = 1 \cr 2T(n/2) + O(n) & n > 1 \end{cases}$
110110
111111其对应的递归树如下图所示。
112112
113- ![ ] ( https://qcdn.itcharge.cn/images/20220414171458.png )
113+ ![ 归并排序算法的递归树 ] ( https://qcdn.itcharge.cn/images/20220414171458.png )
114114
115- 因为 $n = 2^x$,则 $x = \log_2n$,则归并排序算法的时间复杂度为:$2^x \times T(1) + x \times O(n) = n + \log_2n \times O(n) = O(n \times log_2n)$。
115+ 因为 $n = 2^x$,则 $x = \log_2n$,则归并排序算法的时间复杂度为:$2^x \times T(1) + x \times O(n) = n + \log_2n \times O(n) = O(n \times \ log_2n)$。
116116
117117## 4. 分治算法的应用
118118
@@ -150,7 +150,7 @@ $T(n) = \begin{cases} \begin{array} \ O{(1)} & n = 1 \cr 2T(n/2) + O(n) & n > 1
150150
151151使用归并排序算法对数组排序的过程如下图所示。
152152
153- ![ ] ( https://qcdn.itcharge.cn/images/20220414204405.png )
153+ ![ 归并排序算法对数组排序的过程 ] ( https://qcdn.itcharge.cn/images/20220414204405.png )
154154
155155#### 4.1.4 代码
156156
@@ -221,7 +221,7 @@ class Solution:
221221
222222二分查找的的分治算法过程如下图所示。
223223
224- ![ ] ( https://qcdn.itcharge.cn/images/20211223115032.png )
224+ ![ 二分查找的的分治算法过程 ] ( https://qcdn.itcharge.cn/images/20211223115032.png )
225225
226226#### 4.2.4 代码
227227
0 commit comments