码迷,mamicode.com
首页 > 编程语言 > 详细

[算法Tutorial]分治,平摊,对手论证

时间:2014-11-08 00:47:16      阅读:570      评论:0      收藏:0      [点我收藏+]

标签: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

 

[算法Tutorial]分治,平摊,对手论证

标签:style   io   ar   os   sp   strong   div   on   2014   

原文地址:http://www.cnblogs.com/godfray/p/4082565.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!