Skip to content

算法Algorithm

最远点优先 k-center

Farthest-first traversal · Gonzalez k-center algorithm · Metric k-center · 最远点优先遍历

每次选离现有中心最远的点,以覆盖半径和 k+1 个分离点共同证明离散度量 k-center 的二倍近似。

把五个服务地点排在数轴的 0,1,2,3,4 处,只能在其中两处设置站点。若先选 0,离它最远的是 4;两站放好后,地点 2 离最近站点仍有距离 2。这并非最优:选 1,3 就能让每个地点离某站至多 1。最远点优先的价值在于,这种损失有一个对所有有限度量都成立的上限,而且算法能把证明所需的见证一起交出来。

形式陈述 ​

点、中心与目标值 ​

输入是有限度量空间 (X,d),n=|X|>0,以及整数 1≤k≤n。中心必须是 X 的点。对 C⊆X、|C|=k,定义

d(x,C)=minc∈Cd(x,c),R(C)=maxx∈Xd(x,C),R∗=min|C|=kR(C).

这是最小化最远地点到最近中心的距离。它既不是所有距离之和,也不是每个簇内部两点距离的最大值。有限性保证所有最小值取得,非负性允许在 R∗=0 时仍用 R(C)≤2R∗ 表达二倍近似,无需除以零。

输出包括中心身份 c1,…,ck、每个点的最近中心及半径 R。当 k<n 时,再给一个最远未选点 ck+1,使这 k+1 个点两两相距至少 R。于是读者得到一份可行覆盖与一个最优半径下界 R/2,不必知道最优中心究竟在哪里。

空集单独约定只接受 k=0,返回空中心、空指派与半径零。非空输入不接受 k=0,因为到空中心集合的最近距离不是有限值。若允许伪度量,需先合并零距离类再讨论互异中心;本页接口保持真正度量,不在程序中悄悄合并身份。

只维护最近距离 ​

任取一个起点 c1,其后重复选择

cj+1∈argmaxx∈Xd(x,Cj),Cj={c1,…,cj}.

并列按预先固定的点序处理。维护数组 D[x]=d(x,Cj);加入新中心 c 后只需

D[x]←min{D[x],d(x,c)}.

若新距离严格更小,连同最近中心身份一起改写;相等时保留旧身份即可。每轮后的最大 D[x] 就是当前覆盖半径。由正定性,未被选完时仍有正距离的点,所以最大者不会是已有中心。

Gonzalez 的原算法也是逐次选择最远的簇头。[1, §2] 其原文分析的目标是最大簇直径;这里固定中心半径目标,并在下节直接证明相应的 R/2 下界,避免把两种目标值混用。[2, §4.2]

直觉

选一个中心后,最该担心的是仍离所有中心很远的地点。把它变成新中心,会把某些最近距离降低,其他最近距离不变,因此覆盖半径单调不增。不过,“修补当前最坏点”还不足以证明近似:关键是这些被选中的点同时记录了此前各轮的困难。

假设最后还剩一个距离 R 的点。后选中心在入选时比它早的中心都至少离这么远,否则当时最大的最近距离就不可能最终仍有 R。因而中心连同最后的最远点形成 k+1 个彼此分离的地点。任何只开 k 个站的方案,都必须让某一站同时负责其中两个;三角不等式把这两个地点的间距变成该站覆盖半径的二倍下界。

中心覆盖与分离见证

两个方向都要核验 ​

最近距离数组的归纳很直接。第一中心加入后,D[x]=d(x,c1)。若更新前 D[x]=minc∈Cjd(x,c),再与 d(x,cj+1) 取小,恰是对 Cj+1 的最小值。因此最终指派确实覆盖所有点,半径不会因为漏看某中心而报大或报小。

再记第 j 轮覆盖半径为 Rj。数组只会下降,所以 R1≥⋯≥Rk=R。任取 a<b≤k+1,在 cb 被选为最远点时,

d(ca,cb)≥d(cb,Cb−1)=Rb−1≥R.

这里 ck+1 只作见证,并不增加实际站点数。把 k+1 个见证指派给任意最优的 k 个中心,至少两点 u,v 共用一个中心 c。于是

R≤d(u,v)≤d(u,c)+d(c,v)≤2R∗.

这同时证明 R/2≤R∗≤R。当 k=n 时全体点都是中心,R=R∗=0,无需构造不存在的第 n+1 点。

例子与边界

把五点例子算到底 ​

按身份 0,1,2,3,4 排列,初始中心取 0。执行过程为:

已加入的中心 各点最近距离 下一最远点
{0} (0,1,2,3,4) 4
{0,4} (0,1,2,1,0) 2,只作见证

最近中心身份为 (0,0,0,4,4);中点平局留给旧中心 0。半径 R=2,见证 {0,4,2} 的三组距离是 4,2,2,所以任何两个中心的最优半径至少为 1。方案 {1,3} 达到 1,故二倍损失在这个实例上恰好取等。附件枚举中心组合时按身份序返回另一个同样最优的方案 {0,3}。

证书与算法轨迹承担不同任务。验证输出的 k 个中心、全部指派距离不超过 R,并检查 k+1 个见证的所有点对距离至少为 R,已经足以证明二倍近似;这份验证器无需重跑贪心。若还声称“这就是指定起点和并列规则的运行”,才需要逐轮核最大者。

半径与簇直径差在哪里 ​

半径为 R 的中心指派使每个簇的直径至多 2R,因为簇内两点都能经由中心连接;但直径可能小于这个上界。对另一目标“把 X 分成 k 个非空簇,最小化最大簇直径”,上述 k+1 个见证给出的下界是 R:同簇的两点本身就相距至少 R。结合算法簇直径至多 2R,也得到二倍近似,却是另一套上下界。不能对中心半径直接宣称最优值至少为 R,五点例子已经否定它。

改输入合同会发生什么 ​

若把中心放到点集外,有限矩阵没有提供到那些位置的距离。二维连续的一中心问题可由最小包围圆求解;它使用坐标和几何支持点,输出的中心甚至不是输入点。本页的程序只返回原点身份,不自动解决受限设施集、连续平面或带容量版本。

若使用平方距离,二倍因子也会变化。数轴 0,1,2 上,平方距离矩阵满足 d(0,2)=4 而 d(0,1)+d(1,2)=2。选一个中心并从 0 开始,半径为 4,最优中心 1 的半径为 1,已超过二倍。失败发生在三角不等式,不是并列规则。

推论与应用

固定预算与固定尺度互相读取 ​

覆盖数与 packing把半径固定,询问要多少中心;k-center 把中心数固定,询问需要多大半径。最远点序列可以同时给出这些尺度的信息:持续加入最远点,直到覆盖半径不超过给定 ε,所得中心是一个内部 ε-cover;除第一点外,每次入选时距离旧中心严格大于 ε,所以这些中心也形成严格 ε-packing。

这不表示其中心数最少。它说明每个入选点都有“此前所有中心都覆盖不到我”的理由,从而把覆盖的可行性与分离的必要性连在同一条序列上。若把终止条件改成严格小于 ε,packing 的边界不等号也要相应改变。

时间、存储与输入验证 ​

每轮扫描 n 个点更新距离,再扫描取最大值,k 轮为 O(nk) 次距离访问与比较,工作数组和输出中心共 O(n+k) 空间。证书验证可直接检查 n 份指派和 (k+12) 个见证点对,需 O(n+k2) 次访问。附件另做穷举最优对照,代价为 O((nk)nk);这不属于贪心算法的运行界。

这些界把一次距离查询视为单位操作。若距离由 oracle 提供且一次成本为 Td,查询部分乘 Td;若预先存完整矩阵,输入本身另占 Θ(n2)。读入并验证方阵、正定性和对称性需 O(n2),穷尽三角不等式需 O(n3),不能算进免费的输入承诺。精确有理数的比较还须计入分子分母位长。

有限度量单元终点继续使用这五个点:固定中心预算给覆盖,固定尺度给随机块,再把多尺度块组织成树。三种输出的半径、块数与距离保证分别核验。

参考资料
  1. Teofilo F. Gonzalez,Clustering to Minimize the Maximum Intercluster Distance,Theoretical Computer Science38,1985,pp.293–306,§2,尤其 Lemma2.1、Algorithm APPROX、Theorems2.2–2.3,pp.295–296:最远簇头机制与最大簇直径保证。
  2. Michael Dinitz,Approximation Algorithms,Lecture4,JHU,2024-02-01,§4.2,pp.2–4:离散 k-center 半径目标和二倍近似。
关系图谱9 个相邻概念 · 2 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组
类型化关系