贪婪算法,用于查找可与平面中所有圆相交的最小行数

时间:2018-04-18 15:21:38

标签: algorithm greedy

我在家庭作业中遇到问题,我需要找O(n.log(n)) 贪婪算法,用于与平面中所有圆相交所需的最小行数,如下例所示。

The minimum number of lines is 4

所有行的起点是(0,0),它是原点。集C包含n个圆圈,其中每个圆圈c_i都包含有关其半径r_i及其中心坐标(x_i, y_i)的信息。

我试过制定贪婪的规则:

  1. 迭代集合C中的每个圈子并选择c_i
  2. 构造从originc_i的3条线,其中2条线是仅与圆中的1个点相交的切线,1条线是通过其中心穿过圆的正割线。 / LI>
  3. 迭代其余剩余的圈c_j (j != i)并查看与这些行相交的圈数
  4. 选择行L_i并从平面中删除与其相交的圆圈。
  5. 继续直到飞机为空。
  6. 但我不认为这个贪婪的规则会达到最佳解决方案,其复杂性不会是O(n.log(n))

    任何提示或完整解决方案都可以。问题表中还提到,给出minimum + 1行的贪婪规则很好。

2 个答案:

答案 0 :(得分:1)

此问题看起来像“按点覆盖细分”。您可以谷歌搜索或查看此处https://medium.com/competitive/covering-segments-by-points-fc2c56c4b038。在您的情况下,而不是段,您的每个圆圈都有角度。和线而不是点。

唯一的区别是细分不是在一条线上而是在一条圆上。这就是为什么你的回复中允许你额外的一行可以任意选择一个起点。

答案 1 :(得分:0)

由于您可以使用超过最小值的一行,因此您可以从任意行开始。顺时针继续逐行,直到所有圆相交。只要在它们之间没有圆圈,每条新线应该具有与最后一条最大的角度。您找到的2条切线对于查找每个步骤可以走多远很有用,但检查每个步骤的每个圆圈都会非常耗时。看看你是否可以弄清楚如何加快它。