标签:style io ar os sp strong div on 2014
今天的算法课高能的不行,对助教各种膜拜~~这里就厚颜无耻地讲讲吧,当然还有抄袭,hiahia~~
1. Divide and Conquer
首先,提到这个高能的问题,不得不说说那个Master Theory,简直是外挂、BUG...
$$T(n) = aT(n/b) + f(n); \text{assuming} n = b^x$$
$$T(n) = \underbrace{\Theta(n^{\log_b a})}_{\text{solving base cases}}+\underbrace{\sum\limits_{j=0}^{(\log_b n) -1}a^j f\left(\frac{n}{b^j}\right)}_{g(n)=\text{ dividing and combining}}$$
Case 1: $f(n) = O(n^{\log_b a-\varepsilon})$ :
$g(n) = O(n^{\log_b a}); T(n) = \Theta(n^{\log_b a})$
Case 2: $f(n) = \Theta(n^{\log_b a})$ :
$g(n) = n^{\log_b a} \log_b n; T(n) = \Theta(n^{\log_b a}) \log_b n$
Case 3: $f(n) = \Omega(n^{\log_b a+\varepsilon})$ :
$g(n) = \Theta(f(n)); T(n) = \Theta(f(n))$
有了这个利器,我们就能运用一定的技巧来解题啦~~
Problem 1: n-bit整数的乘法(喂,我们讲的是二进制啊~~)
其实,我们小学数学就教过的列竖式的方法,要先计算1-bit乘以n-bit,然后还要适当进行移位,最后再相加,注意我们这里定义的Elementary Options是两个n-bit数的加法是$O(n)$,1-bit乘以n-bit为$O(1)$,移位操作也为$O(1)$,所以共要进行$n$次乘法,大约是$n$次移位,最后是$n$次的加法,由于加法本身已经是$O(n)$的了,所以总的复杂度达到了$O(n^2)$。许多年来我们都是这么做的啊,也没什么不好,而且似乎一度有人认为n-bit整数乘法的下界就是$\Omega(n^2)$了。
到了1960年的时候,提出了一种新的算法,复杂度降低到了$O(n^{1.59})$,其实,你发现了么,就是$O(n^{\log_2 3})$,然后你看看Master Thm,也能够凑出来啦~~首先,我们进行分的操作:
$$x=x_L|x_R=x^{n/2}x_L+x_R$$
$$y=y_L|y_R=y^{n/2}y_L+y_R$$
$$xy=(x^{n/2}x_L+x_R)(y^{n/2}y_L+y_R)$$
$$xy=2^nx_Ly_L+2^{n/2}(x_Ly_R+x_Ry_L)+x_Ry_R$$
可是,这样的结果是,最终问题规模缩减一半,但是我们需要解决4个这样的子问题,然后还有$n+n/2$次移位操作,得到的递归式:
$$T(n)=4T(n/2)+\Theta(n)=\Theta(n^2)$$
居然没有提高!!好吧,想想办法!
$$(x_L+x_R)(y_L+y_R) = x_Ly_L+(x_Ly_R + x_Ry_L) + x_Ry_R$$
我们不妨写为$P_0=P_1+P_2+P_3$,这里的$P_1,P_2,P_3$都是我们要在上面过程中计算的,通过计算$(x_L+x_R)(y_L+y_R)$,代价为$O(n)$,原本的4个子问题减少为3个,递归式:
$$T(n)=3T(n/2)+\Theta(n)=\Theta(n^{\log_2 3})$$
Problem 2: 矩阵乘法
这里定义的矩阵都是$n\times n$的矩阵,规定的Elementary Operations,加法和两个元素间的乘法复杂度均为$O(1)$
这样,对于结果的$n^2$个元素,每个都需要进行$n$次加法和$n$次乘法,所以总的复杂度为$O(n^3)$,Oh no,这很吓人!
想想递归,如果我们像上面整数乘法的方法一样,对矩阵进行分块呢?
$$X=\left[
\begin{array}{c|c}
A & B \\\hline
C & D \\
\end{array}
\right],\quad Y=\left[
\begin{array}{c|c}
E & F \\ \hline
G & H \\
\end{array}
\right]$$
那么
$$XY =\left[
\begin{array}{c|c}
AE+BG & AF+BH \\\hline
CE+DG & CF+DH \\
\end{array}
\right]$$
这里的Combine的复杂度主要体现在矩阵的加法上,$\dfrac{n}{2}\times\dfrac{n}{2}$个数相加,复杂度为$\Theta(n^2)$, 我们来看看递归式
$$T(n)=8T(n/2)+\Theta(n^2)=\Theta(n^3)$$
还是没变!!当然,我们可以继续用Problem 1中的技巧(Strassen Algorithm),可以降到只需解决7个规模为$n/2$的子问题,最终$$T(n)=\Theta(n^{\log_2 7})=\Theta(n^2.808)$$
一个好消息是,在2014年,矩阵乘法问题的复杂度已经降到了$\Theta(n^{2.373})$,可喜可贺!问题的下界也只不过是$\Omega(n^2)$
2. Amortized Analysis
3. Adversary Argument
标签:style io ar os sp strong div on 2014
原文地址:http://www.cnblogs.com/godfray/p/4082565.html