不同的三角形顶点数量

时间:2019-01-21 22:03:44

标签: algorithm performance geometry

给我以下问题来解决:

  

考虑给您N个不同的点,它们同时具有正x坐标和正y坐标。对于每个坐标,您将形成一个直角三角形,其两侧将坐标和x轴相对于x轴成45度角。因此,在两侧的相交处形成直角,并且三角形的斜边在x轴上。创建这些三角形后,在给定的N个点中找到点的数量,其中创建的三角形均不与这些点重叠。

     

例如,假设N = 3,我们得到的分数是(4,6),(7,   2),(2、5)

     

(4,6)点的三角形的附加顶点:(-2,6),(10,6)

     

点(7,2)的三角形的附加顶点:(5,2),(9,2)

     

(2,5)点的三角形的附加顶点:(-3,5),(7,5)

     

在此示例中,由坐标(4,6)形成的三角形将   与坐标(7,2)重叠,因此正确的输出为2   因为只有点(4,6)和(2,5)与创建的点不重叠   三角形。

到目前为止,我已经观察到,为了检查一个点的三角形是否与N个点之一相交,请计算y值的差,并检查它是否大于或等于的绝对值差。 x值,因为三角形边的斜率将始终为1。使用此属性,我的解决方案使用二次算法,该算法将集合中的每个点与每个其他点进行比较。但是,我希望在线性或线性运算时间内解决此问题,因此我需要帮助编写更有效的算法。

注意:x和y值的大小非常大,因此我不能使用基于坐标大小进行迭代的解决方案。


1 个答案:

答案 0 :(得分:1)

以(x + y)的降序对点进行排序,使用(y-x)的降序来打破平局。

然后,当您按顺序迭代这些点时,将丢弃与上一个未丢弃点的三角形重叠的点。

完成后剩下的点是没有任何三角形重叠的点。

总复杂度为O(N log N),主要是对点进行排序。

之所以可行,是基于以下事实:您保留的每个点的三角形都包括所有将来的点,这些点与从先前保留的点开始的三角形重叠。