【问题标题】:Algorithm for finding the maximum number of points求最大点数的算法
【发布时间】:2018-05-13 04:13:48
【问题描述】:

令 P = {P1(x1, y1), P2(x2, y2), . . . , Pn(xn, yn)} 是一组位于矩形内的 n 个点,使得没有一个点接触其边界。矩形的左上角位于原点 O(0, 0)。沿矩形的下边缘放置一个平面镜(如图所示)。点光源放置在 O 处。该光源可以以任意角度 θ 发出单光线。

编写一个算法(伪代码)来计算 θ 的值,对应的光线及其反射一起通过集合 P 的最大点数。

例如图中,角度为 θ1 的射线 R1(用实线表示)经过 3 个点,而角度为 θ2 的射线 R2(用虚线表示)仅经过 2 个点。只有当您的算法花费 O(n log n) 时间时,您才会获得完整的信用。

.................................................. .

如果要找到 θ 的值,使平面上的最大点数位于入射光线上,我会做这个问题。

那时我会通过将光线聚焦在每个点上来计算每个点的 θ 值,并将这些点的 θ 值存储在一个数组中。

那么我们的问题将简化为找到数组中重复元素的最大数量。这可以在 O(n) 时间内解决。

但我不知道如何处理反射光线。我在互联网上搜索但徒劳无功。请帮忙。

【问题讨论】:

  • 主要技巧是通过反射复制点。然后数相等的角度。

标签: algorithm computational-geometry point


【解决方案1】:

一种方法是使用method of images,它通过在反射面的另一侧引入“镜像点”来代替反射效果。

假设镜子由平面y=-b 定义,那么每个点(x_i, y_i) 将用于生成自身的反射版本。该额外点将具有相同的 x 坐标,但在与镜子对称的相反距离上具有 y 坐标,即-b - (y_i + b),即-2b - y_i。 (在您的情况下,所有 y_i 都是负数。)每个点的反射版本精确地模拟了从镜子反弹后到达原始点的光线的几何形状。此后,我们可以忽略镜像,只使用 2N 个点。

因此,您的算法的伪代码可能会像这样运行:

  • 在镜面下方生成一组额外的 N 个点,使用 图像的方法
  • 计算2N个点中每个点与原点的角度, 使用atan2(y_i, x_i)。这需要 N 阶时间。
  • 按与原点的角度对点进行分组,相当于 对它们进行排序并检测列表中相邻值之间的变化, 这需要 N(log N) 阶的时间。
  • 计算每组中的点数。 (这需要的时间少于 N。)
  • 找到成员最多的组。

【讨论】:

  • 不能通过角度对点进行散列来按角度对点进行分组需要 O(n) 时间吗?
  • @גלעד ברקן 可能是正确的,它通常可以使用散列来减少按角度对点进行分组的计算成本,但我认为这不是真的在最坏的情况下。我相信,O(n log n) 的复杂度保证是任意数量和布局的点的最坏情况成本。
【解决方案2】:

镜子的位置是未指定的,所以我们假设y = -1具体。要将光反射到点(x, y)y > -1,我们需要从(0, 0) 瞄准(x/(y+1), -1)。这个点可以通过观察原点和反射点形成的直角三角形与目标和反射点形成的直角三角形相似。

【讨论】:

    猜你喜欢
    • 2010-09-06
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 2016-02-04
    • 2013-01-16
    • 1970-01-01
    • 2020-11-10
    • 2017-03-29
    相关资源
    最近更新 更多