• 平面最近点对


    给定(n)个点((x_1,y_1),(x_2,y_2,cdots,(x_n,y_n)),求最近点对,即

    [min_{i ot= j}{ ext{dis}(i,j)} ]

    其中( ext{dis}(i,j))为点(i)和点(j)的距离,(n le 200000)

    有一个很简单的(mathcal{O}(n ^ 2))做法,就是枚举(i,j)然后算距离,这里不展开讲。

    讲一下分治的做法:
    每次用一条直线(我称为分界线)将整个平面分成两部分(L,R),将点分成两部分,如图。

    算出两边的最近点对距离(dis_L,dis_R),考虑如何算出(L o R)的最近点对。

    有一种比较简单的方法是在(L)当中枚举点和每一个(R)配对,复杂度太高了。

    考虑什么样的情况对答案的更新是有效的。

    (delta = min(dis_L,dis_R)),在这条分界线左右(delta)远处作两条平行的直线,如图。

    例如我现在考虑点R,以其为圆心,(delta)为半径作圆,其中与右边那条虚线所框出来的点就是有意义的点,如图。

    (N,M)
    因为圆不好整,所以补成矩形。

    证明:这个矩形里最多只有(6)个点。
    将其分成六个等大的小矩形,长(frac{2}{3}delta),宽(frac{1}{2}delta),反证,如果个数(>6),那么有一个矩形就会有(2)个点,这两个点的最远距离为(sqrt{left(frac{2}{3}delta ight)^2 + left(frac{1}{2}delta ight)^2} = frac{5}{6}delta < delta),不符合(delta)定义。

    于是(O(nlog{n}))分治解决。

  • 相关阅读:
    二级联动选择框的实现
    vimperator
    Ipan笔记-2
    git的一些补充点
    联想云部署的笔记心得
    关于vim的折叠
    ipan笔记
    php中浮点数计算问题
    Chrome 控制台报错Unchecked runtime.lastError: The message port closed before a response was received
    PHP-redis中文文档
  • 原文地址:https://www.cnblogs.com/luyiming123blog/p/14194337.html
Copyright © 2020-2023  润新知