凸组合

nn 元点集 P={p1,p2,,pn}P=\{p_1,p_2,\dots, p_n\},对于实数 λ1,λ2,,λn\lambda_1,\lambda_2,\dots, \lambda_n,满足:

  1. λi0,i=1,2,,n\lambda_i\ge 0,i=1,2,\dots,n
  2. i=1nλi=1\sum_{i=1}^n \lambda_i=1

那么称 i=1nλipi\sum_{i=1}^n \lambda_i p_i 为点集 PP 的一个凸组合,其中 pip_i 是以原点为起点,以这个点为终点的向量。

凸包

nn 元点集 PP 的凸包,定义为所有 PP 的凸组合构成的集合,形式化地:

CH(P)={i=1nλipiλi0,i=1nλi=1}CH(P)=\left\{\sum_{i=1}^n \lambda_i p_i \Bigg| \lambda_i\ge 0,\sum_{i=1}^n \lambda_i=1 \right\}

也就是说,某一点 qq 在凸包内部当且仅当它能被表示为 PP 的某个凸组合。

凸集

一个点集 CC 为凸集,当且仅当对于任意两个点 p,qCp,q\in C,对任意的 λ(0,1)\lambda\in(0,1),都有 λp+(1λ)qC\lambda p+(1-\lambda)q\in C

凸包是一个凸集

证明 PP 的凸包是一个凸集:

不妨设 p=i=1nλipip=\sum_{i=1}^n \lambda_i p_iq=i=1nμipiq=\sum_{i=1}^n\mu_ip_i,那么任取一个 γ(0,1)\gamma\in (0,1),有 γp+(1γ)q=i=1n[γλi+(1γ)μi]pi\gamma p+(1-\gamma)q=\sum_{i=1}^n [\gamma \lambda_i+(1-\gamma)\mu _i]p_i

观察系数,γ(0,1),λi,μi0\gamma\in (0,1),\lambda_i,\mu_i\ge 0,因此每一个系数都非负;并且 i=1n[γλi+(1γ)μi]=γi=1nλi+(1γ)i=1nμi=1\sum_{i=1}^n[\gamma \lambda_i+(1-\gamma)\mu_i]=\gamma\sum_{i=1}^n\lambda_i +(1-\gamma)\sum_{i=1}^n \mu_i=1

所以 CH(P)CH(P) 是一个凸集。证毕。

凸包是“最小”的凸集

何为最小?形式化地,证明对于任意的凸集 CC,如果 PCP\subseteq C,那么 CH(P)CCH(P)\subseteq C

任取 pCH(P)p\in CH(P),都存在一组 λi\lambda_i,使得 p=i=1nλipip=\sum_{i=1}^n\lambda_ip_i,下面我们用数学归纳法证明,形如这样的 pCp\in C

设其中有 kkλi\lambda_i 不为零,因为这些 λi\lambda_i 的和是 11,那么 k1k\ge 1。下设不为零的 λi\lambda_i 分别为 λj1,λj2,,λjk\lambda_{j_1},\lambda_{j_2},\dots,\lambda_{j_k}。当 k=1,2k=1,2 时,根据定义有 pCp\in C

k=k0k=k_0 时,命题成立,那么 k=k0+1k=k_0+1 时,因为 k2k\ge 2,所以显然不可能有一个 λ=1\lambda=1,并且:

p=λjkpjk+i=1k1λjipji=λjkpjk+(1λjk)i=1k1λji1λjkpji\begin{aligned} p&=\lambda_{j_k}p_{j_k}+\sum_{i=1}^{k-1} \lambda_{j_i}p_{j_i}\\ &=\lambda_{j_k}p_{j_k}+(1-\lambda_{j_k})\sum_{i=1}^{k-1}\frac{\lambda_{j_i}}{1-\lambda_{j_k}} p_{j_i} \end{aligned}

结合 i=1kλji=1\sum_{i=1}^k \lambda_{j_i}=1,我们有 i=1k1λji1λjk=1\sum_{i=1}^{k-1}\cfrac{\lambda_{j_i}}{1-\lambda_{j_k}}=1。由归纳假设,i=1k1λji1λjkpjiC\sum_{i=1}^{k-1}\cfrac{\lambda_{j_i}}{1-\lambda_{j_k}}p_{j_i}\in C,把它看成一个整体后,用定义可以得知 pCp\in C。证毕。

Andrew 算法

为了方便行文,我们引入一个记号 Δ(A,B,C)=(xBxA)(yCyA)(xCxA)(yByA)\Delta(A,B,C)=(x_B-x_A)(y_C-y_A)-(x_C-x_A)(y_B-y_A),也就是 ABABACAC 的叉积。

算法流程如下:

  1. 将点集 PP 按照 xx 为第一关键字、yy 为第二关键字的字典序升序排序;
  2. 维护一个栈 SS,顺序遍历 PP 中节点,假设当前遍历到 pip_i
    • S1|S|\le 1,直接将 pip_i 入栈;
    • 否则,设 AA 为栈顶下一个元素,BB 为栈顶元素,如果 Δ(A,B,pi)>0\Delta (A,B,p_i)>0,那么 pip_i 入栈,否则弹出栈顶元素,重复上一步。
  3. 遍历完成后得到下凸壳,反方向遍历一遍得到上凸壳。按照算法的执行逻辑,不难看出 p1,pnp_1,p_n 一定是下凸壳的起点和终点、上凸壳的终点和起点。

于是我们得到了一个逆时针的、首尾相接的边的多边形。

C1,C2,,CmC_1,C_2,\dots,C_m 为这个多边形的顶点。为了简化行文,我们令 Cm+1=C1C_{m+1}=C_1

下证所有多边形内部的点构成的集合 CC,是原点集 PP 的凸包 CH(P)CH(P)

形式化地,集合 CC 被定义为:

C={QR2i[1,m],Δ(Ci,Ci+1,Q)0}C=\left\{Q\in \mathbb R^2\mid \forall i\in[1,m],\Delta(C_i,C_{i+1},Q)\ge 0\right\}

要证明 C=CH(P)C=CH(P),我们只能证明这两个集合互相包含。

P 是 C 的子集

我们将通过数学归纳法证明这一结论,我们将要证明:任取 PP 中的一个点 pp,对于任意 i[1,m1]i\in [1,m-1],都有 Δ(Ci,Ci+1,p)0\Delta(C_i,C_{i+1},p)\ge 0

为了避免讨论 xx 相同的情况,我们给所有的点做一个线性变换,让每一个点都左乘变换矩阵 T=[1ε01]T=\begin{bmatrix}1&\varepsilon\\0&1\end{bmatrix},显然 det(T)=1\det(T)=1,通过简单的代数展开可以得到,Δ(A,B,C)0\Delta(A,B,C)\ge 0 当且仅当 Δ(TA,TB,TC)0\Delta(TA,TB,TC)\ge 0。由于点集是有限的,我们总能取到一个 ε\varepsilon,使得变换后 xx 互不相同,并且变换之后仍然保持字典序升序。

一旦允许了这样的事情之后,这个证明就变得及其简单了:当我们处理下凸壳,进行弹出栈的操作时,每一段横坐标对应的新的斜率总会比原来的斜率更小,从而这个边界的每一个点对应的 yy 坐标都在减小。通过归纳假设,我们可以断定原先的点 yy 坐标必然仍然 $\ge $ 边界的 yy 坐标。

通过代数变形可以得知这和 Δ0\Delta\ge 0 是等价的,又因为对原图的任意三个点 Δ(A,B,C)0\Delta(A,B,C)\ge 0 当且仅当 Δ(TA,TB,TC)0\Delta(TA,TB,TC)\ge 0,所以我们证明了对于下凸壳上的所有点, Δ(Ci,Ci+1,p)0\Delta(C_i,C_{i+1},p)\ge 0 恒成立。

对于上凸壳也是同理,因此 PCP\subseteq C

CH(P) 是 C 的子集

我们可以先给出一个结论,对任意凸组合,都有 Δ(A,B,λp)=λΔ(A,B,p)\Delta(A,B,\sum \lambda p)=\sum \lambda\Delta(A,B,p)

这个证明比较麻烦,但是只是中学数学的公因式消消乐,本文不做过多阐述。

有了上面这个公式,就可以直接得到:任取 p,qCp,q\in C,任取 λ[0,1]\lambda\in[0,1],对于所有的 CiCi+1C_iC_{i+1},都有 Δ(Ci,Ci+1,λp+(1λ)q)=λΔ(Ci,Ci+1,p)+(1λ)Δ(Ci,Ci+1,q)0\Delta(C_i,C_{i+1},\lambda p+(1-\lambda)q)=\lambda \Delta(C_i,C_{i+1},p)+(1-\lambda)\Delta(C_i,C_{i+1},q)\ge 0,因此 CC 是一个凸集。

我们之前证明了,如果 CC 是凸集,并且 PCP\subseteq C,就有 CH(P)CCH(P)\subseteq C

C 是 CH(P) 的子集

这个命题的意思就是要我们证明,CC 中任意一个点都可以表示成 PP 中点的凸组合。

同样是给每一个点都左乘变换矩阵 TT,保证 xx 互不相同之后来研究。

对于 CC 中任意一个点 Q(x,y)Q(x,y),总可以在下凸包找到 xixxi+1x_i\le x\le x_{i+1},那么过 QQ 引一条铅垂线,与下面这个边的交点是可以被边的顶点用凸组合表示的,对于上凸包同理,那么这两个交点进一步可以用凸组合表示出 QQ。我承认这里没有那么严谨,民科轻喷。

因此 CCH(P)C\subseteq CH(P)