【问题标题】:Number of distinct triangle vertices不同三角形顶点的数量
【发布时间】:2019-01-21 22:03:44
【问题描述】:

我被要求解决以下问题:

假设您有 N 个不同的点,同时具有正 x 坐标和正 y 坐标。对于每个坐标,您将形成一个直角三角形,其两侧连接坐标和相对于 x 轴 45 度的 x 轴。因此,在两边的交点处形成一个直角,并且三角形的斜边在 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 值的大小非常大,所以我不能使用基于坐标大小进行迭代的解决方案。


【问题讨论】:

    标签: algorithm performance geometry


    【解决方案1】:

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

    然后,当您按该顺序遍历点时,丢弃与前一个未丢弃点的三角形重叠的点。

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

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

    这种方法有效的证据是基于您保留的每个点的三角形包括与先前保留点的三角形重叠的所有未来点。

    【讨论】:

    • 如果我们只将这些点与前一个点进行比较,那么我们如何知道一个三角形是否与多个点重叠。例如,如果我们将点 (4,90) 添加到示例案例中,这应该与集合中的所有其他点重叠。
    • 我们将点与前一个未丢弃点进行比较。对于 (4,90),x+y 将是 94,因此 (4,90) 将在 x+y 降序中排在第一位。每隔一个点都会与那个点进行比较并丢弃。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多