Field note

divide_and_conquer

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)T(N) = 2T(N/2) + cN = 2[2T(N/2^2) + cN/2] +cN = 2^2T(N/2^2) + 2cN = \dots = 2^kT(N/2^k) + 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)if T(N) = 2T(N/2) + cN^2 = 2[2T(N/2^2) + cN^2/2^2] + cN^2 = 2^kT(N/2^k) + cN^2(1+ 1/2) = \dots = 2^kT(N/2^k) + cN^2(1+1/2+ \dots + 2/2^k) = \Omega(N^2)

??? example1 suppose T(N)=2T(n)+logn,T(N)=?T(N) = 2T(\lfloor\sqrt{n}\rfloor) + \log{n},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(N2+17)+NT(N) = 2T(\lfloor\frac{N}{2}\rfloor + 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

Form 1

T(n)=aT(nb)+f(n),a1,b2T(n) = aT(\frac{n}{b}) + f(n),a \geq 1,b\geq2 \notag
  1. 若对于某个ϵ\epsilonf(n)=O(nlogbaϵ)f(n) = O(n^{\log_{b}a-\epsilon}),则T(n)=Θ(nlogba)T(n) = \Theta(n^{\log_{b}a});
  2. f(n)=Θ(nlogba)f(n) = \Theta(n^{\log_{b}a}),则T(n)=Θ(nlogbalogn)T(n) = \Theta(n^{\log_{b}a}\log{n});
  3. 若对于某个ϵ\epsilonf(n)=Ω(nlogba+ϵ)f(n) = \Omega(n^{\log_{b}a+\epsilon}),且对某个常数c<1c < 1和所有足够大的nnaf(n)cf(n)af(n) \leq cf(n),则T(n)=Θ(f(n))T(n) = \Theta(f(n))
  • In example 2,the conclusion is wrong because f(N)=NlogNf(N) = NlogN doesn’t match any form above.So we can’t use master method.

Another form of master method

  1. 若对于某个常数有c>1c>1af(nb)=cf(n)af(\frac nb)=cf(n),则T(n)=Θ(nlogba)T(n) = \Theta(n^{\log_b a});
  2. af(nb)=f(n)af(\frac nb)=f(n),则T(n)=Θ(nlogbalogn)T(n)=\Theta(n^{log_ba}\log n);
  3. 若对于某个常数c<1c<1af(nb)=cf(n)af(\frac nb)=cf(n),则T(n)=Θ(f(n))T(n)=\Theta(f(n));

同样是看谁占据主导地位,最后时间复杂度就由谁控制.

Theorem

对于递推式T(n)=aT(nb)+Θ(nklogpn),a1,b>1,k1,p0T(n)=aT(\frac nb)+\Theta(n^k\log^pn),a \geq1,b>1,k\geq1,p\geq0

  1. a>bka>b^k,则T(n)=Θ(nlogba)T(n) = \Theta(n^{\log_ba});
  2. a=bka=b^k,则T(n)=Θ(nklogp+1n)T(n)=\Theta(n^k\log^{p+1}n);
  3. a<bka<b^k,则T(n)=Θ(nklogpn)T(n) = \Theta(n^k\log^pn).

??? tips “主定理记忆小技巧” - 主定理顾名思义是看谁占主导地位,如果a>bka > b^k,那么我们就可以说是logba\log_{b}{a}占据了主导地位,这时候T(N)=O(Nlogba)T(N) = O(N^{\log_{b}{a}}) - 而如果a<bka < b^k,我们就可以说是f(N)f(N)占据了主导地位,这时候T(N)=O(f(N))T(N) = O(f(N)) - 如果相等,二者各占一半,T(N)=O(f(N)logN)T(N) = O(f(N)\log{N}) - 其他两种形式也是一样的

??? 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*}
$$

最近点对问题

分别为三个部分,左最近点对、右最近点对和分离最近点对,关键在于线性时间找到分离最近点对.

我们首先可以取xx坐标的中点,记为x\overline{x},然后考虑[xδ,x+δ]\lbrack\overline{x}-\delta,\overline{x}+\delta\rbrack(δ\delta是左右两半中最近点对距离)之间的所有点q1,q2,qlq_1,q_2,\dots q_l,它们按yy坐标排序.设qiq_i的坐标为yiy_i,那么我们只需要对qiq_i检查xx坐标在[xδ,x+δ]\lbrack\overline{x}-\delta,\overline{x}+\delta\rbrack之间,yy坐标在[yi,yi+δ]\lbrack y_i,y_i+\delta\rbrack之间构成的长方形区域中的点是否有更近点点对即可(所有点往上找就行,往下和下面的点往上找重合).

我们将这个长方形区域平均分为8块,则每块内最多出现一个点,否则每块内两点距离不超过22δ\frac{\sqrt 2}{2}\delta,并且每块都不跨中点,这与δ\delta是左右两半中最近点对距离矛盾,因为我们可以找到距离最短的两点.所以对于每个qiq_i,我们只需找向上7个点即可,所以找分离最近点对的时间复杂性是线性的.

最近点对