Divide and Conquer
General recurrence : T(N) = aT(N/b) + f(N)
T(N)=2T(N/2)+cN=2[2T(N/22)+cN/2]+cN=22T(N/22)+2cN=⋯=2kT(N/2k)+kcN=N+cNlogN=O(NlogN)
if T(N)=2T(N/2)+cN2=2[2T(N/22)+cN2/22]+cN2=2kT(N/2k)+cN2(1+1/2)=⋯=2kT(N/2k)+cN2(1+1/2+⋯+2/2k)=Ω(N2)
??? example1
suppose T(N)=2T(⌊n⌋)+logn,T(N)=?
令$m = \log{n}$,那么原式可变为$T(2^m) = 2T(2^{\frac{m}{2}}) + m$
然后另$S(m) = T(2^m)$,那么$S(m) = 2S(\frac{m}{2}) + m$,这是我们熟悉的归并排序的结果,因为$S(m) = O(m\log{m})$,那么$T(N) = \log{n}\log{\log{n}}$
??? example2
suppose T(N)=2T(⌊2N⌋+17)+N
当$N$很大的时候,17是完全可以被我们忽略的,所以直接猜测$O(n\log{n})$,代入验证就可以了
??? example3
给定一个整数M,
$$
T(n) =
\left\{
\begin{matrix}
8T(\frac{n}{2}) + 1,n^2 > M \\
M \ ,otherwise
\end{matrix}
\right.
$$
有$\log_{2}{\frac{n}{\sqrt{M}}}$层,每层1个单位时间,且有$8^{\log_{2}{\frac{n}{\sqrt{M}}}}$个叶子,每个叶子M个单位时间,故总时间为
$$
O(M \cdot 8^{\log_{2}{\frac{n}{\sqrt{M}}}} + \log_{2}{\frac{n}{\sqrt{M}}}) = O(\frac{n^3}{M})
$$
Master Method
T(n)=aT(bn)+f(n),a≥1,b≥2
- 若对于某个ϵ有f(n)=O(nlogba−ϵ),则T(n)=Θ(nlogba);
- 若f(n)=Θ(nlogba),则T(n)=Θ(nlogbalogn);
- 若对于某个ϵ有f(n)=Ω(nlogba+ϵ),且对某个常数c<1和所有足够大的n有af(n)≤cf(n),则T(n)=Θ(f(n))
- In example 2,the conclusion is wrong because f(N)=NlogN doesn’t match any form above.So we can’t use master method.
- 若对于某个常数有c>1有af(bn)=cf(n),则T(n)=Θ(nlogba);
- 若af(bn)=f(n),则T(n)=Θ(nlogbalogn);
- 若对于某个常数c<1有af(bn)=cf(n),则T(n)=Θ(f(n));
同样是看谁占据主导地位,最后时间复杂度就由谁控制.
Theorem
对于递推式T(n)=aT(bn)+Θ(nklogpn),a≥1,b>1,k≥1,p≥0
- 若a>bk,则T(n)=Θ(nlogba);
- 若a=bk,则T(n)=Θ(nklogp+1n);
- 若a<bk,则T(n)=Θ(nklogpn).
??? tips “主定理记忆小技巧”
- 主定理顾名思义是看谁占主导地位,如果a>bk,那么我们就可以说是logba占据了主导地位,这时候T(N)=O(Nlogba)
- 而如果a<bk,我们就可以说是f(N)占据了主导地位,这时候T(N)=O(f(N))
- 如果相等,二者各占一半,T(N)=O(f(N)logN)
- 其他两种形式也是一样的
??? info “更强的主定理”
对于上面的主定理我们还有更强的形式:
$$
\begin{align*}
&对于递推式T(n)=aT(\frac nb)+\Theta(n^k\log^pn),a \geq1,b>1,k\geq1,p为任意实数\\
&1. 若a>b^k,则T(n) = \Theta(n^{\log_ba});\\
&2. 若a=b^k,则\\
& (a). 若p>-1,则T(n)=\Theta(n^k\log^{p+1}n);\\
& (b). 若p=-1,则T(n)=\Theta(n^k\log{\log{n}});\\
& (c). 若p<-1,则T(n)=\Theta(n^k);\\
&3, 若a<b^k,则 \\
& (a). 若p\geq 0,则T(n) = \Theta(n^k\log^pn).\\
& (b). 若p<0,则T(n) = \Theta(n^k).
\end{align*}
$$
最近点对问题
分别为三个部分,左最近点对、右最近点对和分离最近点对,关键在于线性时间找到分离最近点对.
我们首先可以取x坐标的中点,记为x,然后考虑[x−δ,x+δ](δ是左右两半中最近点对距离)之间的所有点q1,q2,…ql,它们按y坐标排序.设qi的坐标为yi,那么我们只需要对qi检查x坐标在[x−δ,x+δ]之间,y坐标在[yi,yi+δ]之间构成的长方形区域中的点是否有更近点点对即可(所有点往上找就行,往下和下面的点往上找重合).
我们将这个长方形区域平均分为8块,则每块内最多出现一个点,否则每块内两点距离不超过22δ,并且每块都不跨中点,这与δ是左右两半中最近点对距离矛盾,因为我们可以找到距离最短的两点.所以对于每个qi,我们只需找向上7个点即可,所以找分离最近点对的时间复杂性是线性的.
最近点对