V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
jlsk
V2EX  ›  问与答

新听到一个超难算法题,大家来集思广益

  •  
  •   jlsk · Sep 4, 2017 · 5459 views
    This topic created in 3169 days ago, the information mentioned may be changed or developed.
    给定 N 个基础点坐标(x,y),求离指定点(px,py)最近的基础点
    基础点可以预处理
    要求时间复杂度<N
    29 replies    2017-10-26 20:45:06 +08:00
    aheadlead
        1
    aheadlead  
       Sep 4, 2017
    什么叫“基础点”
    xiang578
        2
    xiang578  
       Sep 4, 2017 via iPhone
    不知道是不是 kd tree
    GreatHumorist
        3
    GreatHumorist  
       Sep 4, 2017 via iPhone
    向量计算公式?
    Valyrian
        4
    Valyrian  
       Sep 4, 2017 via iPad   ❤️ 1
    jlsk
        5
    jlsk  
    OP
       Sep 4, 2017
    @Valyrian 这个强,但是这个没法快速查找出来

    @xiang578 应该就是它了,这能确实的<N 的时间查找出来,貌似还有更快的?
    blahgeek
        6
    blahgeek  
       Sep 4, 2017 via iPhone
    lsmgeb89
        7
    lsmgeb89  
       Sep 4, 2017
    这种算计算几何领域的算法?
    yangff
        8
    yangff  
       Sep 4, 2017
    @jlsk 这不都告诉你了用 voronoi 图了啊,O(NlogN)初始化,O(1)查询,还不是美滋滋
    yangff
        9
    yangff  
       Sep 4, 2017
    具体你可以看 voronoi 图的扫描线构造方法,反正你是一次性的。
    ryd994
        10
    ryd994  
       Sep 4, 2017 via Android
    这也叫难?你想想手机基站的工作范围就可以想通了
    剩下的是怎么把想法转化为算法
    jedihy
        11
    jedihy  
       Sep 5, 2017
    google onsite 题,转换为极座标之后二分搜索
    jedihy
        12
    jedihy  
       Sep 5, 2017
    @yangff 预处理不能给你这样预处理的,你这样我直接算距离初始化的时候 O(N)就全部做完了。
    原题是说可以你可以选择给出的坐标的形式,然后让你找出距离最近的点。提示也很明显<O(N),那就是 O(nlogn)了。
    Xs0ul
        13
    Xs0ul  
       Sep 5, 2017
    @jedihy #11 能进一步解释一下极坐标的做法不?
    Valyrian
        14
    Valyrian  
       Sep 5, 2017
    @jedihy 预处理的时候没有 px, py 啊
    jedihy
        15
    jedihy  
       Sep 5, 2017
    @Xs0ul 给我一点时间,去年准备 google onsite 的时候和同学讨论过,现在忘了,但思路我记得很清楚是极座标然后二分。
    jedihy
        16
    jedihy  
       Sep 5, 2017
    @Valyrian 那这种方法是可行的,不过太高端了。
    jlsk
        17
    jlsk  
    OP
       Sep 5, 2017
    @yangff
    @Valyrian
    @jedihy
    怎么 O(1)时间查找出来啊? voronoi 图虽然能画出来但是给定任意一个(px,py)你仍然不能确定它在哪个点的范围内,有立即求出的方法?
    linux40
        18
    linux40  
       Sep 5, 2017 via Android
    极坐标二分要用到极坐标下的距离公式吧。
    messyidea
        19
    messyidea  
       Sep 5, 2017
    想来想去总感觉极坐标二分不了(
    能想到一些杂七杂八预处理优化的办法, 但都能构造出在极端情况下退化到 O(N)的情况.
    坐等正解
    Valyrian
        20
    Valyrian  
       Sep 5, 2017 via iPad
    helica
        21
    helica  
       Sep 5, 2017 via iPhone
    量化后,线段树乱搞吧
    yangff
        22
    yangff  
       Sep 5, 2017
    @jlsk sweeping line 之后你就可以知道每个点属于 voronoi 图中的哪个区域了
    yangff
        23
    yangff  
       Sep 5, 2017
    hmm …… 如果你的 px, py 不是预先给出的话,查询是 logn 的
    至于你可以用的各种算法你可以参考一下这本书…… 计算几何--算法与应用(第三版)
    GtDzx
        24
    GtDzx  
       Sep 5, 2017
    话说 google onsite 出这题的话是想听到什么回答呢?
    我如果说我知道可以用 voronoi 图搞,但是具体怎么搞不会。是不是直接就跪了 -_-!!
    要不然是可以先假设基础点分布比较随机,扯一扯 kd-tree/geohash 以及 google s2 库的实现?
    northisland
        25
    northisland  
       Sep 5, 2017
    图片搜索 CBIR,或者图片配准中,的最基础问题了。
    属于暴力搜索的近似问题,

    现在最流行 Optimized Product Quantization 和 Product Quantization Tree。之前的 FLANN ( kd-Trees 和 K-Mean Trees 结合)也很经典。

    https://github.com/yahoo/lopq
    https://github.com/cgtuebingen/Product-Quantization-Tree

    那都是高维数据的玩法,这就是二维。
    rashawn
        27
    rashawn  
       Sep 5, 2017 via iPhone
    预处理是啥意思…
    zagreb
        28
    zagreb  
       Sep 5, 2017 via iPhone
    前几天不是有人发帖问“已知调色板中 N 个基本颜色,求任意颜色在调色板中最接近的颜色?”么。一个二位空间,一个 rgb 色彩空间。
    artandlol
        29
    artandlol  
       Oct 26, 2017 via Android
    傻比
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   2679 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 67ms · UTC 15:52 · PVG 23:52 · LAX 08:52 · JFK 11:52
    ♥ Do have faith in what you're doing.