如何在范围搜索中使用莫顿阶(z阶曲线)?

Posted

技术标签:

【中文标题】如何在范围搜索中使用莫顿阶(z阶曲线)?【英文标题】:How to use Morton Order(z order curve) in range search? 【发布时间】:2015-07-22 03:23:21 【问题描述】:

如何在范围搜索中使用莫顿顺序? 来自wiki,在“使用一维数据结构进行范围搜索”段落中,

它说

"表示查询的范围(x = 2, ..., 3, y = 2, ..., 6) 由虚线矩形。它的最高 Z 值 (MAX) 为 45。在此 例如,搜索数据时遇到值 F = 19 Z 值增加方向的结构。 ......BIGMIN(36 在 例如).....只在BIGMIN和MAX之间的区间内搜索......"

我的问题是:

1) 为什么 F 是 19?为什么 F 不应该是 16?

2) 如何获得BIGMIN

3) 是否有任何网络博客演示如何进行范围搜索?

【问题讨论】:

对 DynamoDB 有潜在帮助的应用程序:aws.amazon.com/blogs/database/… 【参考方案1】:

似乎未对***文章中引用的示例进行编辑以阐明上下文和假设。该示例中使用的方法适用于仅允许顺序(向前和向后)搜索的线性数据结构;也就是说,假设不能仅使用 morton 索引在恒定时间内随机寻找存储单元。

有了这个限制,一个人的策略从一个完整的范围开始,即最小 morton 指数 (16) 和最大 morton 指数 (45)。为了进行优化,人们试图找到并消除查询矩形之外的大片子范围。图中的阴影区域是指如果没有应用这种优化(消除子范围),将会(按顺序)访问的内容。

在讨论了线性顺序数据结构的主要优化策略之后,接下来讨论其他具有更好搜索能力的数据结构。

【讨论】:

谢谢。我想'如何'。是否有任何网络博客详细演示了如何进行范围搜索?【参考方案2】:

编辑:AWS 数据库博客现在有 a detailed introduction to this subject。


This blog post 合理地说明了这个过程。

搜索矩形空间时x=[2,3], y=[2,6]

    最小 Z 值 (12) 是通过交织最低 xy 值的位找到的:分别为 2 和 2。 最大 Z 值 (45) 是通过交织最高 xy 值的位找到的:分别为 3 和 6。 找到最小和最大 Z 值(12 和 45)后,我们现在有了一个可以迭代的线性范围,保证包含矩形空间内的所有条目。线性范围内的数据将成为我们实际关心的数据的超集:矩形空间中的数据。如果我们简单地遍历整个范围,我们将找到我们关心的所有数据,然后是一些。您可以测试您访问的每个值,看看它是否相关。

一个明显的优化是尽量减少必须遍历的多余数据的数量。这在很大程度上取决于您在数据中穿过的“接缝”数量——“Z”曲线必须进行较大跳跃才能继续其路径的位置(例如,从 Z 值 31 到下面的 32)。

这可以通过使用BIGMINLITMAX 函数来识别这些接缝并导航回矩形来缓解。为了尽量减少我们评估的不相关数据的数量,我们可以:

    记录我们访问过的连续垃圾数据的数量。 确定此计数的最大允许值 (maxConsecutiveJunkData)。顶部链接的博文使用3 作为该值。 如果连续遇到maxConsecutiveJunkData不相关的数据,我们会发起BIGMINLITMAX。重要的是,在我们决定使用它们时,我们现在位于线性搜索空间内(Z 值 12 到 45)但矩形搜索空间之外。在***的文章中,他们似乎选择了maxConsecutiveJunkData4;他们从 Z=12 开始,一直走到矩形之外的 4 个值(超过 15),然后才决定现在是使用 BIGMIN 的时候了。因为maxConsecutiveJunkData 任你选择,BIGMIN 可用于线性范围内的任何值(Z 值 12 到 45)。有点令人困惑的是,这篇文章仅将 19 岁以后的区域显示为交叉阴影线,因为这是当我们使用 BIGMIN 和 4 的 maxConsecutiveJunkData 时将优化的搜索子范围。

当我们意识到我们已经在矩形之外游荡得太远了,我们可以得出结论,矩形是不连续的。 BIGMINLITMAX 用于识别拆分的性质。 BIGMIN 旨在给定线性搜索空间中的任何值(例如 19),找到将回到具有较大 Z 值的分割矩形的一半内的下一个最小值(即,将我们从 19 跳到 36)。 LITMAX 类似,帮助我们找到最大的值,它将位于 Z 值较小的分割矩形的一半内。 BIGMINLITMAX 的实现在链接博文的zdivide 函数解释中进行了深入解释。

【讨论】:

raima.com 的链接已损坏。它可以在 WayBack 机器上找到,地址为web.archive.org/web/20180311015006/https://docs.raima.com/rdme/…。 另见relevant paper,这可能是其他来源的基础。它的可读性很好。 另一个不错的链接,在 raima.com 上仍然有效(但内容与上面的链接不同):raima.com/wp-content/uploads/…

以上是关于如何在范围搜索中使用莫顿阶(z阶曲线)?的主要内容,如果未能解决你的问题,请参考以下文章

用三阶贝塞尔曲线拟合圆

使用空间填充曲线的空间和时空索引

简单而粗暴的方法画任意阶数Bezier曲线

Android UI贝塞尔曲线 ① ( 一阶贝塞尔曲线 | 二阶贝塞尔曲线 )

Android UI贝塞尔曲线 ⑦ ( 使用 德卡斯特里奥算法 公式计算的 方法绘制三阶贝塞尔曲线示例 )

一阶逻辑统一