Mysql ts,群集半径): 集群=dict() 关于员额中的p: #每当添加新帖子时,也会执行此内部部分 簇[p]=簇([p]) 点集=集(点) 当设置点时: #每当添加新帖子时,也会执行此内部部分 p=点集.pop() q=kd_树。最近邻(p) 距离=距离(p,q) 半径p=簇[p]。最小圆半径() 半径=簇[q]。最小圆半径() 如果半径p+距离+半径q

Mysql ts,群集半径): 集群=dict() 关于员额中的p: #每当添加新帖子时,也会执行此内部部分 簇[p]=簇([p]) 点集=集(点) 当设置点时: #每当添加新帖子时,也会执行此内部部分 p=点集.pop() q=kd_树。最近邻(p) 距离=距离(p,q) 半径p=簇[p]。最小圆半径() 半径=簇[q]。最小圆半径() 如果半径p+距离+半径q,mysql,algorithm,data-structures,geolocation,Mysql,Algorithm,Data Structures,Geolocation,上面尝试根据簇_半径将两个簇合并为一个簇。有一些优化的空间,但它应该在O(N logn)左右运行。因为我没有编写特定的类和函数,所以它不会编译,但希望它能让人理解。它假设点(立柱的横向/纵向)已输入到k-d树中。将lat和long从度-分-秒分数转换为秒-分数可能也是个不错的主意。5km可能足够小,可以将坐标视为欧几里德点,而不会引入太多错误,因为它在聚类中是近似的 查询只需通过k-d树查找用户位置(query_radius-cluster_radius)内的所有簇,并且至少包括最近的簇。您提供

上面尝试根据簇_半径将两个簇合并为一个簇。有一些优化的空间,但它应该在O(N logn)左右运行。因为我没有编写特定的类和函数,所以它不会编译,但希望它能让人理解。它假设点(立柱的横向/纵向)已输入到k-d树中。将lat和long从度-分-秒分数转换为秒-分数可能也是个不错的主意。5km可能足够小,可以将坐标视为欧几里德点,而不会引入太多错误,因为它在聚类中是近似的

查询只需通过k-d树查找用户位置(query_radius-cluster_radius)内的所有簇,并且至少包括最近的簇。您提供的数字将使查询半径为5公里。群集半径的几种可能性:

  • 5公里(全半径)
  • 2.5公里(半半径)
  • 几百英尺(按街区排列)

回顾过去,应将坐标转换为3d点,并应使用3d kd树。尽管如此,该问题仅在两条直线上明显,即负lat/long变为正lat/long。回想起来,坐标应转换为3d点,并应使用3d kd树。尽管如此,该问题仅在负lat/long变为正lat/long的两条线路上明显。
def cluster_posts(points,cluster_radius):
    clusters = dict()
    for p in posts:
        # This inner part is also done whenever a new post is added
        clusters[p] = Cluster([p])
    points_set = set(points)
    While points_set:
        # This inner part is also done whenever a new post is added
        p = points_set.pop()
        q = kd_tree.nearest_neighbor(p)
        dist = distance(p,q)
        radius_p = clusters[p].smallest_circle_radius()
        radius_q = clusters[q].smallest_circle_radius()
        if radius_p + dist + radius_q < cluster_radius:
            new_cluster = clusters[p].merge(clusters[q])
            r = new_cluster.smallest_circle_radius()
            if r < cluster_radius:
                c = new_cluster.smallest_circle_center()
                points_set.remove(q)
                clusters.remove(q)
                clusters.remove(p)
                kd_tree.remove(p)
                kd_tree.remove(q)
                points_set.add(c)
                kd_tree.add(c)
                clusters[c] = new_cluster