当前位置: 首页 > 知识库问答 >
问题:

覆盖n个点的最小圆数

东方涛
2023-03-14
  1. 将求解第一个点的第一个圆放置在适当位置。
  2. 通过检查这两个点之间的距离是否小于2*r来求解最小圈数中的第二个点。并继续处理所有n个点。我认为是贪婪算法,但它是最优的,线性的吗?

共有1个答案

龙才俊
2023-03-14

我能想到的最简单的方法就是,把你的点放在一个数组里。

在每个点上迭代,增加它与前一个点之间的距离,直到累积的距离大于2R。

添加到全局计数器中。重置距离,重复。

count = 1
last_point = point_list[0]
distance = 0
for(point in point_list)
   distance += norm(point - last_point)
   if(distance >= 2r)
     count++
     distance = 0
   last_point = point

由于堆栈溢出不会格式化latex,您将不得不接受原样的latex表示法。

假设我们有一组点$P$。假设$D=max(P_I-P_J)$其中$p_i,p_j\in P$。如果$D<2R$,则radius R的某个磁盘$C$的$P\子集C$。

给定一个新点$q\notin p$如果$max(q-p)<2r$其中$p\在p$中存在$\则$$磁盘$D$使得${q}\cup p\子集d$。

然后参考前面部分中描述的算法。每当一个连续点序列的跨度小于$2R$时,$\就存在一个包含这些点的磁盘(由前面的参数)。如果在序列中找到一个新点,使得它到最远点的距离大于$2R,那么就需要一个额外的圆(同样由引理1)。

引理2假设,要知道是否需要一个新的圆,我们只需要关注最后一组点,前提是我们已经按顺序访问了这些点(从而访问了这些集合)。如果一个新点与最后一个集合中最远的点的距离小于2r,则不需要新的圆,否则就需要一个新的圆(根据引理1),因此我们将注意力集中在这个新点(及其关联的集合)上。

我们这样做,直到所有的点都访问过。

 类似资料:
  • 一个圆覆盖一个点,如果该点位于圆内。如果一个点与圆心的距离小于或等于r,则该点位于圆内。

  • 给定一组< code>n点< code>(a_1,b_1),< code>(a_2,b_2),...,< code>(a_n,b_n)。需要找到最小的< code>x,使得三个长度为< code>x的< code >轴平行正方形一起覆盖所有的点。 我可以找到包含所有点的最小面积的矩形。这个矩形可以以某种方式使用吗?或者任何关于如何处理这个问题的提示?

  • 给定一个点集S,要求用2个固定半径r的圆复盖最大数目的点。通过考虑距离小于2r的每对点,可以计算出一个圆盘所能覆盖的最大点数。通过一对点可以构造2个圆。从所有这样的组合中,选择覆盖最大点的圆和覆盖第二最大点的圆。但它会给出最优答案吗,还是这种方法要做一些改变呢?

  • 我正在寻找一些解决方案,如果给定一组具有2D中心点和半径的圆,则在中返回一个最小子集,该子集完全覆盖具有2D中心点和半径的特定圆。最后一个圆圈不在中。 我已经选择了圆形,但如果我们把它们改成正方形、六边形等也没关系。

  • 我试图找出一种算法来寻找二部图的最小顶点覆盖。 我在考虑一个解决方案,将问题简化为二部图中的最大匹配。众所周知,可以使用从bip创建的networ中的最大流量来找到它。图表 最大匹配M应该决定最小。顶点覆盖C,但我无法处理选择要设置C的顶点。假设bip。图有部分X、Y,作为最大匹配边endpoint的顶点在集合A中,那些不属于B的顶点。 我会说,我应该为M到C中的边选择一个顶点。特别是M中的边e的