Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/algorithm/10.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Algorithm 贪心算法,以找到最小数量的线,可以相交的所有圆在平面上_Algorithm_Greedy - Fatal编程技术网

Algorithm 贪心算法,以找到最小数量的线,可以相交的所有圆在平面上

Algorithm 贪心算法,以找到最小数量的线,可以相交的所有圆在平面上,algorithm,greedy,Algorithm,Greedy,我的作业有问题,我需要找到一个O(n.log(n)) 贪心算法,用于求平面中所有圆相交所需的最小线数,如下例所示 所有线条的起点都是(0,0),这是原点。集合C包含n个圆,其中每个圆C\u i都有关于其半径r\u i及其中心坐标(x\u i,y\u i)的信息 我试过制定贪婪的规则: 在集合C中的每个圆上迭代,然后选择C\u i 从原点到c_i构造3条线,其中2条线是仅与圆中1点相交的切线,1条线是通过圆心穿过圆的正割线 迭代其他剩余的圆cj(j!=i),看看有多少圆与这些线相交 选择线L_i

我的作业有问题,我需要找到一个
O(n.log(n))
贪心算法,用于求平面中所有圆相交所需的最小线数,如下例所示

所有线条的起点都是
(0,0)
,这是原点。集合
C
包含
n
个圆,其中每个圆
C\u i
都有关于其半径
r\u i
及其中心坐标
(x\u i,y\u i)
的信息

我试过制定贪婪的规则:

  • 在集合
    C
    中的每个圆上迭代,然后选择
    C\u i
  • 原点
    c_i
    构造3条线,其中2条线是仅与圆中1点相交的切线,1条线是通过圆心穿过圆的正割线
  • 迭代其他剩余的圆
    cj(j!=i)
    ,看看有多少圆与这些线相交
  • 选择线
    L_i
    ,并从平面中删除与其相交的圆
  • 继续,直到飞机空了
  • 但是我不认为这个贪婪的规则会得到最佳的解决方案,它的复杂性不会是
    O(n.log(n))


    任何提示或完整的解决方案都可以。问题单中还提到,贪心规则可以给出
    最小+1
    行。

    由于可以使用比最小行多的一行,因此可以从任意行开始。顺时针一行一行地继续,直到所有圆相交。每一条新线应该与最后一条线有尽可能大的角度,只要它们之间没有圆圈。找到的两条切线有助于确定每一步可以走多远,但检查每一步的每个圆会很耗时。看看你是否能想出加速的办法。

    这个问题看起来像是“逐点覆盖线段”。你可以用谷歌搜索,或者看看这里。在您的例子中,每个圆都有角度,而不是线段。和线而不是点


    唯一的区别是线段不在一条线上,而是在一个圆上。这就是为什么在你的回答中允许有一条额外的线来任意选择一个起点。

    我不确定2条切线+正割线是否正确,因为你可能会遗漏较小的圆:但这似乎是个好主意,也许从相同的点升级到一个三角形,然后检查多边形与其他三角形的交点。因此,从原点开始完全向北的直线不能完全向南延伸-它们将计为两条直线,而不是一条?@userunknown是的