我正在尝试理解RTree算法的基础知识,并且我试图弄清楚它如何执行搜索例如距离1公里范围内的所有零售商。我们将把所有对象存储在我们数据库中的矩形中,然后我们会(可能)根据我们当前的位置构建一个查询矩形,然后找到与它重叠的所有矩形。然后我们扫描结果以找到感兴趣的结果,即只有作为餐馆的对象?
答案 0 :(得分:4)
是的,这基本上是对R树上 range 查询的工作方式:如果矩形与查询区域重叠,请展开它(查看内容,矩形或点)。否则,忽略它。对于矩形到矩形,重叠测试很简单,对于球形查询,您需要计算球体中心与矩形的最小距离(“minDist”)。
k最近邻查询有点棘手;在这里你需要优先队列。始终扩展最佳候选者(通过“minDist”),直到找到比下一个矩形“minDist”更近的k个对象。
由于您无法真正索引“是餐馆”属性,因此您必须构建仅包含餐馆的r树,或者按餐馆属性过滤结果。 (这也是如何在例如SQLite中完成的;空间部分用R树索引,而餐厅属性例如通过连接或位图索引获得)
R树的棘手部分是不查询,但是如何构建它。批量加载点数据(STR)有非常简单但很好的方法,但对于在线数据库,您需要一些棘手的方法。根据我的经验,R * -tree显着优于经典的R树; R * -trees使用的重新插入在真正的DBMS中特别棘手。一个有趣的权衡是只使用R *中的插入和拆分,而不是重新插入。在查询方面,无论如何R和R *之间没有区别。
kd-trees:它们与r-tree相关,但有一些关键区别:首先,它们不是为磁盘存储而设计的,而是仅用于内存操作。其次,它们不是要更新(它们不是平衡的树),但是如果你有变化,你将不得不再次重建它们以保持性能良好。所以在某些情况下它们会表现得非常好(并且它们实现起来相当简单),但是一旦你获得大数据和磁盘,它们就会更加痛苦。此外,他们不允许不同的加载策略。