---
# System prepended metadata

title: 分治
tags: [winter-camp]

---

# 分治
## 主定理

大多數的分治都可以寫成
$$T(n) = aT(\frac{n}{b})+f(N)$$

- $T(N) \implies$總複雜度
- $n \implies$ 問題大小
- $n/b \implies$子問題大小

:::success
就只要 $O(n^{log_ba})$和 $f(n)$ 比較誰大
誰大取誰，一樣大就多一個$log$
:::

$$
\begin{cases}
\begin{align}
    T(n) = O(n^{log_ba}) \qquad  & if \; n^{log_ba} \gt f(n) \\
    T(n) = O(f(n)) \qquad  & if \; n^{log_ba} \lt f(n) \\
    T(n) = O(n^{log_ba}logn) \qquad  & if \; n^{log_ba} = f(n)
\end{align}
\end{cases} $$

## 主定理應用

### 最近點對、合併排序
諸如$T(n) = 2T(\frac{n}{2}) + f(n)$
帶入即得$n^{log_22} = n \implies T(n) = O(nlogn)$

### 多項式乘法
假設有兩個多項式 $f(x), g(x)$同為$N$次
將$f(x)$分成兩個$N/2$次的多項式$f(x) = f_l(x) + x^{\frac{N}{2}} f_r(x)$
將$g(x)$分成兩個$N/2$次的多項式$g(x) = g_l(x) + x^{\frac{N}{2}} g_r(x)$
假設$f_l(x) = a_1, f_r(x) = a_2, g_l(x) = b_1, g_r(x) = b_2$
$$
\begin{align}
f(x) \times g(x) 
    &= (a_1 + x^{N/2} a_2 ) \times (b_1 + x^{N/2}b_2) \\
    &= a_1b_1 + x^{N/2}(a_1b_2+a_2b_1) + x^N a_2b_2
\end{align}
$$
:::danger
這邊的a, b都是多項式乘法，亦即若函數叫做mul(f,g), $a_1b_1$亦需要呼叫$mul(a_1,b_1)$ 只是變成子問題
:::
會發現這樣做會有四次的矩陣相乘($a_1b_1, a_1b_2, a_2b_1, a_2b_2$)需要相加，且妹次的$N\rightarrow N/2$，然後相加都是$O(N)$
可以得到$$T(n) = 4T(N/2) + f(N)$$
由主定裡得到複雜度$O(N^2), (n^{log_24}=n^2)$

#### 優化
可以嘗試做一些優化, 觀察到 $$(a_1+a_2)\times(b_1+b_2) =a_1b_1 + a_1b_2 + a_2b_1 + a_2b_2$$
發現四個都出現了，又因為多項式相加不影響次數，所以$(a_1+a_2)(b_1+b_2)$一樣可以拆成$N\rightarrow N/2$的子問題

所以如果假設 $c=(a_1+a_2)\times(b_1+b_2)$
$$f(x) \times g(x) = a_1b_1 + x^{N/2}(c-a_1b_1-a_2b_2) + x^N ( a_2b_2)$$

只需要算出$a_1b_1, a_2b_2, (a_1+a_2)(b_1+b_2)$這三個的矩陣相乘再透過$c-a_1b_1-a_2b_2$得到$a_1b_2+a_2b_1$即可

分治式變成$T(N)=\color{red}{3}T(N/2)+f(N)$
複雜度$O(n^{log_{2}\color{red}{3}})$

