最近点对算法

最近点对算法

问题描述

二维平面上n个点,求最近的两点距离?

最近点对算法_第1张图片

如例:

    P1 (1,0)、P2 (2,4)、P3 (3,4)
    P4 (3,5)、P5 (3,1)、P6 (5,6)
    P7 (6,3)、P8 (7,1)、P9 (7,2)

最短距离点对有3对,(P2,P3)、(P3,P4)、(P8,P9),最短距离为1.

方法一:蛮力法

  • 两遍循环,枚举任意两点P[i] 、P[j] (i ≠ j) ,求出距离,一一比较,得到最短距离mind.

  • 时间复杂度:两重循环, O ( n 2 ) O(n^2) O(n2).

    暴力法:ClosePoint(P[],n)
    /*
    *输入: 点{x,y}数组P及个数n
    *输出: 输出最近的两点距离
    */
    if n < 2 then   //无点对
    	return INF 
    endif
    
    if n = 2 then  //返回仅有两点距离
    	return dist{P[0],P[1]}
    endif
    
    mind <-- INF  // 标记:最短距离
    for i = 1 to n-1 do
    	for j = i + 1 to n do
    		mind <-- min{ dist{P[i],P[j]} , mind}
    return mind
    

方法二:分治法

  • 点按x大小排序,以中间点P[mid]的x为划分线m,将全部点均分为左右两部分;
  • 分治处理左右子问题,得到左部点集、右部点集点对最近距离 d l 、 d r dl、dr dldr,取最小值d=min { dl,dr } ;

最近点对算法_第2张图片

  • 剩下来,仅需考虑左部点P和右部点Q距离小于d的情况,问题归纳为:

    求左侧点集P={p|m-d<=p.x<=m}和右侧点集Q={q|m

  • 乍一分析,好像还是每层递归都是两重循环,共 l o g n log n logn反而时间复杂度变为了 O ( n 2 l o g n ) O(n^2 log n) O(n2logn),放图:

最近点对算法_第3张图片

  • 如图,左侧点P ( m i d − d < = P . x < = m i d ) (mid-d <= P.x <= mid) (midd<=P.x<=mid),与右侧区域点Q ( m i d < Q . x < = m i d + d ) (mid < Q.x <= mid+d) (mid<Q.x<=mid+d),两点距离dist小于d的点Q最多有6个,道理很简单,将可能区域 d ∗ 2 d d * 2d d2d 划分成6个大小相同的$ d /2 * 2d/3 $,矩形内两点的距离必定小于d,因右部区域两点铁定不超过d,那么一个矩形内绝对不存在两点,即Q最多6个.

  • 每层递归时间复杂度控制在 O ( n ) O(n) O(n) l o g n log n logn层递归树,时间复杂度为 O ( n l o g n ) O(nlog n) O(nlogn)

    分治法:ClosePoint(left,right)
    /*
    *输入: 排序后的点P[left…right]
    *输出: 输出点集[left…right]最近的两点距离
    */
    if left = right then //无点对
    	return INF
    endif
    
    if left + 1 = right then //返回仅有两点距离
    	return dist{P[left],P[right]}
    endif
    
    mid <-- (left+right)/2
    m   <-- P[mid].x //划分线
    
    dl  <-- ClosePoint(left,mid)
    dr  <-- ClosePoint(mid+1,right)
    d   <-- min {dl,dr}
    mind <-- d //标记最小值
        
    S1 <-- {P|m-d <= P.x <= m}
    for each p ∈ S1 do
        for each q ∈ {Q|d<Q.x<=m+d and p.x-d <= Q.y <= p.x+d} do//Q集最多6个点
        	mind <-- min{ mind , dist{p,q}}
    return mind

相关题目:

牛客练习11E:求最值

Code链接

你可能感兴趣的:(计算几何)