Algorithm 最近的一对点采用不同的方法

Algorithm 最近的一对点采用不同的方法,algorithm,divide-and-conquer,Algorithm,Divide And Conquer,我试图解决这个问题,我提出了一个解决方案,如下所示,这与“维基百科”算法大不相同。我无法理解我的解决方案有什么问题,它也是O(nlogn) 输入:沿x-y轴的坐标集。{(2,4)、(5,3)、(3,7)、(4,2)、(6,3)} 我的解决方案: 根据x坐标对给定集合进行排序。{(2,4),(3,7),(4,2),(5,3),(6,3)} . 复杂性O(nlog) 求最小{连续对之间的距离},我们称之为minux。 复杂性O(n) 按y坐标对给定集合排序。{(4,2),(5,3),(6,3),(2

我试图解决这个问题,我提出了一个解决方案,如下所示,这与“维基百科”算法大不相同。我无法理解我的解决方案有什么问题,它也是O(nlogn)

输入:沿x-y轴的坐标集。{(2,4)、(5,3)、(3,7)、(4,2)、(6,3)}

我的解决方案:

  • 根据x坐标对给定集合进行排序。{(2,4),(3,7),(4,2),(5,3),(6,3)} . 复杂性O(nlog)
  • 求最小{连续对之间的距离},我们称之为minux。 复杂性O(n)
  • 按y坐标对给定集合排序。{(4,2),(5,3),(6,3),(2,4),(3,7)} . 复杂性O(nlog)
  • 求最小值{连续对之间的距离},我们称之为minuy。复杂性O(n)
  • min_d=min(min_x,min_y)导致min_d的对是距离最短的对

  • 这是错的吗?我遗漏了什么?

    是的,这是错误的。考虑集合{(0, 0)、(0, 10)、(10, 0)、(0.2,0.2)}作为反例。您的方法将永远不会将(0,0)和(0.2,0.2)作为任何顺序中的连续元素,因此将永远不会找到彼此最接近的两点。

    您的算法将为以下示例生成错误的最佳对:

    var points : [(Int,Int)] = [(0,0),(1,10),(10,1),(3,3)]
    
    /* xmin solution: (1,10), (3,3) (dist = sqrt(4+49) = sqrt(53))
       from sorted list: (0,0),(1,10),(3,3),(10,1)                 */
    
    /* ymin solution: (10,1), (3,3) (dist = sqrt(53))
       from sorted list: (0,0),(10,1),(3,3),(1,10)                 */
    
    /* real solution: (0,0), (3,3) (dist = sqrt(18) < sqrt(53))    */
    
    var点:[(Int,Int)]=[(0,0)、(1,10)、(10,1)、(3,3)]
    /*xmin溶液:(1,10)、(3,3)(dist=sqrt(4+49)=sqrt(53))
    从排序列表中:(0,0)、(1,10)、(3,3)、(10,1)*/
    /*ymin溶液:(10,1)、(3,3)(dist=sqrt(53))
    从排序列表中:(0,0)、(10,1)、(3,3)、(1,10)*/
    /*实解:(0,0)、(3,3)(dist=sqrt(18)
    是的,这是错误的。当x^2或y^2中的任何一个最小时,没有必要将sqrt(
    x^2+y^2
    )设为最小值

    最著名的解决方案的时间复杂度为O(nlogn)。 可在第1039页第33.4节中找到解决方案


    只需阅读第33.4节就足够了。

    “这是错误的吗?”我的意思是,我无法找到反例来证明这是错误的。这就是造成混淆的原因。在您给出的示例中,数据集似乎不匹配。这是一个问题,对吗?我需要理解为什么我的解决方案是错误的。如果你仍然不这样想,我将删除这个问题。谢谢@蒂莫西·格罗特:对不起,现在更正。@RajvidyaChandele很乐意帮忙。