具有一定密度的点的最大子集

Posted

技术标签:

【中文标题】具有一定密度的点的最大子集【英文标题】:Maximum subset of points with certain density 【发布时间】:2016-08-14 19:11:08 【问题描述】:

假设二维平面中有一组点 S,如何从 S 中删除最小数量的点,使得任何两个剩余点之间的距离不小于一个常数,比如 R。

我想这可能是 NP 难的。谁能提出一个快速的近似解决方案?谢谢!

【问题讨论】:

如果只有2个点并且距离小于R,那会是0分吗? @Striker 删除 1 分。你现在只剩下一个点,它没有比 R 更近的点了。 @Striker 我想是的。左边应该有空集 @KlasLindbäck 说得通 @GilbertLee 澄清一下,您是在问如何做到这一点吗?或者这个算法的复杂度是多少? 【参考方案1】:

我的朋友提出了一个合理的解决方案:

构造一个所有边都小于R的图G。要移除的点集与图G的最小顶点覆盖相同。顶点覆盖的近似是多项式时间。

【讨论】:

是的,这是我自己写的。该近似值是 2 近似值,还不错,但 Vertex Cover 也是在解决方案大小中易于处理的固定参数,因此它可以在相当大的实例上精确求解,前提是只需要删除少量顶点. @j_random_hacker 你们都是天才【参考方案2】:

这个速度很快但不是最低点数。请记住,在删除或禁用点时,循环应处理对设置 S 的更改。

 For each Point P1 in S
 
       For each Point P2 after P1 in S 
       
             If (square(P1.x - P2.x) + square(P1.y - P2.y) < square(R) )
             
                   remove (P2)
             
       
 

最低但昂贵:

use double loop to store each P2 closest to P1
example: array [P1][P2]

 Sort array based on size of array [P1].numOfElements ()
 such that largest is at the top

 now remove top element P from set S 
 and in  array P1
 and all subsequent P in P2 of all P1

  If P2 is empty for any element X in P1 then remove it

  Remove the next top element and do the process again until array is empty

  Resulting set is the answer for minimum points

【讨论】:

以上是关于具有一定密度的点的最大子集的主要内容,如果未能解决你的问题,请参考以下文章

LOJ 「LibreOJ β Round #4」子集

最大团问题和最大独立子集

2018青岛网络赛B

具有噪声的基于密度的空间聚类算法--DBSCAN

[BZOJ4808] 马(最大独立集,最大流)

SQL Server 更新字段最大值数据子集