zoukankan      html  css  js  c++  java
  • 平面最近点对

    给定(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}))分治解决。

  • 相关阅读:
    CentOS离线状态下安装Python3.7.0
    SQL练习题
    ajax的工作原理
    总结 XSS 与 CSRF 两种跨站攻击
    转css中文英文换行、禁止换行、显示省略号
    vue项目的搭建
    转axios 的应用
    rem布局计算(移动端,pc端有兼容性)
    rem
    彻底弄懂css中单位px和em,rem的区别
  • 原文地址:https://www.cnblogs.com/luyiming123blog/p/14194337.html
Copyright © 2011-2022 走看看