标签:
现在很多的APP都有"附近的人"功能。
粗略的思考一下,用户在登录的时候会将自己的位置信息告诉服务器,服务器会记录一份用户的位置信息列表。
假设服务器里只有10个人,那么要找附近的人就很简单,只需写一个算距离的函数,然后依次遍历长度是10的位置信息列表,距离从近到远排序,返回排序后的列表即可。
那么如果服务器里有1千万人呢,或者几亿人呢,比如微信。这时再从头到尾遍历(复杂度O(n))就不适合了。
通常情况下会使用“四叉树”来构建这些大量的位置信息。
1.四叉树
顾名思义,四叉树是叶子节点最多为4的树结构。
2.地理位置和四叉树
把全球的位置定义为一个矩形,用经度和纬度的二维数据来定位全球范围内的点。
经度范围[-90,90],纬度范围[-180,180]。
当登录服务器的人数越来越多时,超过一个约定的值,就将这个矩形分割成4个更小的矩形,将这些位置信息分发到更小的矩形里(比如分成太平洋,大西洋等)
更小的矩形存储的信息又要超过约定的值了,就再分割。
3.查找附近的点
假设我在广州天河的华农的图书馆,想要找到附近的十个人的位置。
那么首先需要从根节点(全球)遍历到天河区的节点,搜寻这个节点的列表里有没有十个人。
如果不够十个人,则向上一层的广州节点请求,可能会在海珠区找到剩余的人。
标签:
原文地址:http://www.cnblogs.com/yao2yaoblog/p/5475231.html