点集子集的最小周长凸包

Cha*_* Xu 16 algorithm convex-hull computational-geometry

给出飞机上的n个点.No 3是共线的.

给定数k.

找到k个点的子集,使得k个点的凸包具有k个点的子集的任何凸包的最小周长.

我可以想到一个天真的方法在O(n ^ kk log k)中运行.(找到大小为k的每个子集的凸包并输出最小值).

我认为这是一个NP问题,但我找不到任何适合减少的东西.

有人对这个问题有什么想法?

一个例子,

the set of n=4 points {(0,0), (0,1), (1,0), (2,2)} and k=3
Run Code Online (Sandbox Code Playgroud)

结果:

{(0,0),(0,1),(1,0)}
Run Code Online (Sandbox Code Playgroud)

由于该组包含3个点,因此结果的凸包和周长小于任何其他3个点的周长.

小智 9

这可以在O(kn ^ 3)时间和O(kn ^ 2)空间中完成(或者如果你想要实际点,则可以在O(kn ^ 3)).

本文:http://www.win.tue.nl/~gwoegi/papers/area-k-gons.pdf

由Eppstein等人提出的算法可以解决这个问题,即最小周长和其他权重函数,如面积,内部角度之和等,这些都遵循一定的约束条件,即使标题是最小面积(参见周长的推论5.3).

基本思想是动态编程方法如下(阅读第4节的前几段):

假设S是给定的点集,Q是具有最小周长的k点的凸包.

设p1是Q的最底点,p2和p3是逆时针顺序的船体上的下一个点.

我们可以将Q分解成三角形p1p2p3和k-1点Q'的凸包(它与三角形p1p2p3共用一侧p1p3).

主要观察结果是Q'对于k-1是最佳的,其中最下面的点是p1而下一个点是p3并且Q'的所有点都位于线p2-> p3的同一侧.

因此,为每个四元组(pi,pj,pk,m)维持4d最佳多边形阵列,使得

  • 多边形是一个恰好m个S点的凸包.
  • pi是多边形的最底部点.
  • pj是逆时针顺序的下一个顶点,
  • 多边形的所有点位于线pi - > pj的左侧.
  • 所有点都与pi一样位于pj-> pk的同一侧.

在给定m <= k-1的最佳多边形的情况下,可以帮助我们找到m = k的最佳多边形.

本文详细描述了如何实现这一目标,以达到规定的时空范围.

希望有所帮助.

  • 本文参考了在O(n log n + k <sup> 4 </ sup> n)中找到最小周长k-gons,如果k远小于n,则可能会感兴趣. (2认同)