Algorithm Rtrees-算法的基础知识

Algorithm Rtrees-算法的基础知识,algorithm,r-tree,Algorithm,R Tree,我试图理解RTree算法的基础知识,并试图弄清楚它是如何执行搜索的,例如,1公里内的所有保留者。我们将所有对象存储在数据库中的矩形中,然后根据当前位置(prbably)构建一个查询矩形,然后找到与之重叠的所有矩形。然后,我们是否会扫描结果以找到感兴趣的对象,即仅为餐厅的对象?是的,R树上的范围查询基本上就是这样工作的:如果矩形与查询区域重叠,请将其展开(查看内容、矩形或点)。否则,忽略它。重叠测试对于矩形到矩形很简单,对于球形查询,您需要计算球体中心到矩形的最小距离(“minDist”) k最近

我试图理解RTree算法的基础知识,并试图弄清楚它是如何执行搜索的,例如,1公里内的所有保留者。我们将所有对象存储在数据库中的矩形中,然后根据当前位置(prbably)构建一个查询矩形,然后找到与之重叠的所有矩形。然后,我们是否会扫描结果以找到感兴趣的对象,即仅为餐厅的对象?

是的,R树上的范围查询基本上就是这样工作的:如果矩形与查询区域重叠,请将其展开(查看内容、矩形或点)。否则,忽略它。重叠测试对于矩形到矩形很简单,对于球形查询,您需要计算球体中心到矩形的最小距离(“minDist”)

k最近邻查询有点棘手;这里您需要优先队列。始终展开最佳候选对象(通过“minDist”),直到找到比下一个矩形“minDist”更近的k个对象

因为您不能真正索引“IsaRestaurant”属性,所以您必须构建一个只包含餐馆的r树,或者根据餐馆属性过滤结果。 (这也是如何实现的,例如在SQLite中;空间部分使用R树进行索引,而餐厅属性则通过连接或位图索引获得)

R树中棘手的部分不是查询,而是如何构建查询。对于批量加载点数据(STR),有非常简单但很好的方法,但是对于在线数据库,您需要一些棘手的方法。根据我的经验,R*-树的表现明显优于经典R-树;R*树使用的重新插入在实际的DBMS中实现起来特别困难。一个有趣的折衷方法是只使用insert和splitfromr*,而不是重新插入。在查询端,R和R*之间没有任何区别


kd树:它们与r树相关,但有一些关键区别:首先,它们不是为磁盘存储而设计的,只是为内存操作而设计的。其次,它们不是要更新的(它们不是平衡树),但是如果您有更改,您必须时不时地重新构建它们以保持良好的性能。因此,在某些情况下,它们的性能会非常好(而且实现起来相当简单),但一旦您获得了大数据和磁盘上的数据,它们就要痛苦得多。此外,它们不允许不同的加载策略。

只是一个注释,但要说的是,4条希尔伯特曲线有更多是无意义的。希尔伯特曲线的基本形状只有4个方向。也许你指的是摩尔曲线?即使在2D中,你也可以从每个角开始,然后先走X或Y。已经有8条曲线了。对许多人来说,摩尔曲线也是希尔伯特曲线,因为它由相同的原语组成。但我最感兴趣的是更高维度,而且这个数字上升得更多,因为你可以在每个递归步骤中使用不同的轴排列。你有一种非常奇怪的方式来计算和显示人们的东西。4个角乘以2个轴排列=8个同构变体(+轻微的布局变化,如摩尔)。这里不涉及计数,只涉及乘法。它满足三角形不等式吗?