• 附近点搜索


    参考链接:July_

    记得大致是外卖的笔试题牵扯到一个附近的点,当时蠢,也是为了争取面试的机会,所以写的bfs+优先队列,想通过bfs+优先队列找最近的点,虽然自己心里知道这个方法是不行的,对于附近的点,也是最近看博客了解到的。

    可以用R树,每次将在一个区域中划分,将大的矩形进行划分,并且每次划分成小的矩形,将相邻的矩形划分到一个区域,再次迭代用更大的矩形去包含该区域。

    比如一个卖家要送餐的范围,那就把不同的买家划分成一个个小矩形,用个大的矩形去包含这些小矩形,然后让更大的矩形包含大的矩形,直至最后只剩下两个矩形,然后就方便查找。

    也可以用geohash,如果要确定一个点的位置,将其位置可以划分成一个字符串,然后用字典树进行存储,

    支持地理位置索引是MongoDB的一大亮点,这也是全球最流行的LBS服务foursquare 选择MongoDB的原因之一。我们知道,通常的数据库索引结构是B+ Tree,如何将地理位置转化为可建立B+Tree的形式。首先假设我们将需要索引的整个地图分成16×16的方格,如下图(左下角为坐标0,0 右上角为坐标16,16):

        单纯的[x,y]的数据是无法建立索引的,所以MongoDB在建立索引的时候,会根据相应字段的坐标计算一个可以用来做索引的hash值,这个值叫做geohash,下面我们以地图上坐标为[4,6]的点(图中红叉位置)为例。我们第一步将整个地图分成等大小的四块,如下图:

        划分成四块后我们可以定义这四块的值,如下(左下为00,左上为01,右下为10,右上为11):

        这样[4,6]点的geohash值目前为 00然后再将四个小块每一块进行切割,如下:
        这时[4,6]点位于右上区域,右上的值为11,这样[4,6]点的geohash值变为:0011继续往下做两次切分:
        最终得到[4,6]点的geohash值为:00110100
    然后将得到的二进制编码改为字符串

    十进制

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    10

    11

    12

    13

    14

    15

    base32

    0

    1

    2

    3

    4

    5

    6

    7

    8

    9

    b

    c

    d

    e

    f

    g

    十进制

    16

    17

    18

    19

    20

    21

    22

    23

    24

    25

    26

    27

    28

    29

    30

    31

    base32

    h

    j

    k

    m

    n

    p

    q

    r

    s

    t

    u

    v

    w

    x

    y

     z

    这样就可以根据得到的字符串的前缀得到相邻的点坐标了。
  • 相关阅读:
    MySQL简介
    MySQL表及索引相关知识
    关系型和非关系型数据库
    IntelliSense: #error 指令: Please use the /MD switch for _AFXDLL builds————c++编程问题
    msvcrt是做什么的
    COLORREF的结构和用法
    虚函数这么用,只要有一个基类的指针就行了
    映射的磁盘(网络驱动器)无法显示svn图标
    as3 textfield 旋转文字有锯齿的问题
    cocos2dx中CCFileUtils::sharedFileUtils()>getFileData的内存释放问题
  • 原文地址:https://www.cnblogs.com/chenyang920/p/5979154.html
Copyright © 2020-2023  润新知