【问题标题】:Finding the maximum number of equidistant points on a line segment查找线段上等距点的最大数量
【发布时间】:2012-01-20 06:27:36
【问题描述】:

给定直线段上的一组点。这些点可能位于线上的任何位置。我需要一个算法来找到定期在线上的最大点数。

例如在一条由 y = 0 表示的直线上,我可能有一些点,例如:

[3,0], [1,0], [4,0], [7,0],[11,0], [10,0]

Output : 4 
     [1,0] , [4,0], [7,0], [10,0]

示例 2:

[2,1], [2,5], [2,3], [2,7], [2,6]

Output: 4
    [2,1], [2,3],[2,5], [2,7]

[注意:线可能有任何斜率。我只需要算法的草图。这些点可以被认为是存储在一个二维矩阵中] 请帮忙。

【问题讨论】:

  • 对此有一个非常明显的朴素算法。您对此满意还是需要特别高效的东西?
  • 您绝对可以提出这个想法,我们可以在此基础上进行构建并尝试优化它。 :)

标签: algorithm math language-agnostic


【解决方案1】:

选择一个具有非零(或只是更宽)范围的坐标(例如第一个示例的 X)并按此坐标对您的集合进行排序。然后找到最长的算术级数

【讨论】:

    【解决方案2】:

    这是一个伪代码中的蛮力算法:

    for each point X
      for each point Y != X
        find number of connected points from X using the distance between X and Y
      next Y
    next X
    

    如何使用 X 和 Y 之间的距离从 X 中找到连接点的数量:

    dXY = Y - X
    i = 0
    while point_exists(X + i * dXY)
      i = i + 1
    end while
    

    【讨论】:

    • 我猜它会表现出指数时间复杂度(由于 while 循环)
    • 复杂度应该是二次或三次(取决于最里面的计数是如何实现的),但在所有情况下都是多项式。
    • 外部的两个 for 循环使它成为 N^2。对于每个 i,内部 while 循环试图找到与 X 距离为 (i*dXY) 的点,因此 while 循环的复杂度可能为 O(N^2)。因此总体复杂度 O(N^4) ?
    • 一件事:dXY = Y - X 应该有适当的负号或正号(取决于 Y 是在 X 的左侧还是在 X 的右侧,还是在 x 的顶部或下方)。跨度>
    • while 循环是 O(N^2) 最坏的情况。 X + i * dXY 是一​​个特定的点。检查集合中一个点的存在并不比 O(N) 成本高。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-28
    • 1970-01-01
    • 2012-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-25
    相关资源
    最近更新 更多