我正在处理my gEDA fork并希望摆脱现有简单的基于磁贴的系统有利于实际空间索引。我需要一个空间索引C
有效找到点的算法还不够:我需要查找具有非零范围的对象。想象一下具有边界矩形的对象,这几乎可以捕捉我在索引中需要的详细程度。给定一个搜索矩形,我需要能够有效地找到边界矩形位于内部或与搜索矩形相交的所有对象。
索引不能是只读的:gschem是一个原理图捕获程序,它的全部要点是围绕原理图移动东西。所以事情会变得更加变化。因此,虽然我可以负担得起的插入比搜索更昂贵,但它也不能太昂贵得多,并且删除也必须既可能又合理便宜。但最重要的要求是渐近行为:如果它不能是O(1),搜索应该是O(log n)。插入/删除最好是O(log n),但O(n)可以。我绝对不想要任何东西> O(n)(每个动作;显然O(n log n)是所有对象操作的预期)。
我有什么选择?我觉得不够聪明来评估the various options。理想情况下,会有一些C库为我做所有聪明的事情,但是我会机械地实现一个我可能会或可能不会完全理解的算法,如果必须的话。顺便说一下,gEDA会使用glib,如果这有助于提出建议。
脚注:
示意图标准gEDA的分为“砖”,它用来加速搜索用于在边界矩形的对象的固定数目(目前100)。这显然足以使大多数原理图足够快地进行搜索,但其实现方式会导致其他问题:太多的函数需要指向事实上的全局对象。瓷砖的几何形状也是固定的:仅通过平移(可能缩放)到仅由一个瓷砖覆盖的区域,就可以完全击败该瓷砖系统。
一个合理的答案是保持拼贴系统的元素,但要解决它的弱点:教它跨越整个空间,并在必要时进行细分。但是我希望别人在我专注地决定这是最好的方法之前补充两分钱。
还可以查看http://www.boost.org/doc/libs/1_61_0/libs/geometry/doc/html/geometry/spatial_indexes/rtree_examples/quick_start.html如果还在继续,祝您的项目好运! –