基于Peano-hilbert曲线的索引?
Posted
技术标签:
【中文标题】基于Peano-hilbert曲线的索引?【英文标题】:Indexing based on Peano-hilbert curve? 【发布时间】:2011-04-15 17:02:41 【问题描述】:我有一个 x,y,z 3D 点存储在 mysql 中, 我想问区域,切片或点邻居。 有没有办法使用 Peano-Hilbert 曲线来索引点以加速查询? 或者有没有更有效的方法将 3D 数据存储在 MySQL 中?
感谢阿曼。
【问题讨论】:
【参考方案1】:我个人从未走到这一步,但我使用 Z 曲线来存储 2D 点。这工作得很好,并且感觉没有必要尝试实现希尔伯特曲线以获得更好的结果。
这应该可以让您快速过滤掉肯定不在附近的点。在绝对最坏的情况下,您仍然需要扫描超过 25% 的表格才能找到某个区域内的点。
解决方法是将 x y z 拆分为二进制,然后使用曲线将它们拼接成单个值。我希望我已经准备好一个 SQL 脚本,但我只有一个用于 2d z 曲线的脚本,这要容易得多。
编辑:
很抱歉,您可能已经知道所有这些,实际上只是在寻找 SQL 示例,但我有一些补充:
我不确定 25% 最坏情况扫描是否适用于 3D 平面。可能更高,现在没有脑力告诉你;)。 这种类型的曲线将帮助您找到需要搜索的范围。如果您有 2 个坐标,则可以将它们转换为希尔伯特曲线数,以找出您需要在表格的哪个部分查找与您的查询完全匹配的项目。 您也许可以将此概念扩展到查找邻居,但为了使用曲线,您仍然“卡在”范围内查找。【讨论】:
感谢您的回答,我可以尝试 Z 曲线(或在 3D 中有时称为 Morton 排序)。我看到了一个PostgreSQL的插件:sai.msu.su/~megera/wiki/README_q3c也许还有一个用于MySQL的...... 抱歉造成混淆,但 Z 曲线(莫顿数)的最坏情况是 50%,希尔伯特曲线是 25%。我在博客上写了一组关于 Z 曲线的 3 篇小文章:rooftopsolutions.nl/blog/search?criteria=morton【参考方案2】:您可能可以使用算法创建geohash,并将其扩展为 3 个坐标。基本上,您定义将有一个可能的 3d 点的世界立方体,然后当您添加更多位时,您会缩小立方体。然后,您始终如一地定义它,使左下角具有最小值,并且您可以执行范围检查,例如:
XXXXa < the_hash < XXXXz
【讨论】:
以上是关于基于Peano-hilbert曲线的索引?的主要内容,如果未能解决你的问题,请参考以下文章
IndexError:使用 scikit-learn 绘制 ROC 曲线时数组索引过多?