具有一定密度的点的最大子集
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
【讨论】:
以上是关于具有一定密度的点的最大子集的主要内容,如果未能解决你的问题,请参考以下文章