在水平线上找到穿过3个点的交叉线

时间:2016-08-05 06:14:40

标签: algorithm data-structures geometry

给定一组n个点,它们分布在3条水平线上(y = 0,y = 1,y = 2) 考虑算法找出是否存在与O(n ^ 2)的交叉线

enter image description here

1 个答案:

答案 0 :(得分:0)

我相信这个算法在O(n ^ 2)。首先我们假设:

  1. x - y=2行上各点的坐标可用有限位数表示。
  2. 这些x坐标最初是在x中排序的。如果没有,那么首先对它们进行排序是O(nlog(n))
  3. 交叉线的定义是针对具有有限位数的点的精度进行的。
  4. 现在,构建一个哈希函数,如下所示:

    1. 找到y=2行上相邻点之间的最小距离。由于x - 坐标已排序,因此为O(n)。拨打此最小距离d
    2. 哈希函数是floor(2 * x / d)。很明显,这个哈希会将y=2上的每个点映射到一个唯一的bin。此操作也是O(n)。
    3. 然后,执行以下操作:

      1. 对于y=0y=1行上的每对点,计算其在y=2上的相交点。这是O(n ^ 2)。
      2. 对于y=2上的每个交叉点,查找哈希表以查看该行y=2中是否有一个点。如果有,看看它是否是相同的点(在机器的精度内),如果是,那么就有一条交叉线。否则,没有。这是O(n ^ 2),因为哈希查找是O(1)。
      3. 因此,算法是O(n ^ 2)。没有代码,只有想法。