如何在范围搜索中使用莫顿阶(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) 是通过交织最低
x
和 y
值的位找到的:分别为 2 和 2。
最大 Z 值 (45) 是通过交织最高 x
和 y
值的位找到的:分别为 3 和 6。
找到最小和最大 Z 值(12 和 45)后,我们现在有了一个可以迭代的线性范围,保证包含矩形空间内的所有条目。线性范围内的数据将成为我们实际关心的数据的超集:矩形空间中的数据。如果我们简单地遍历整个范围,我们将找到我们关心的所有数据,然后是一些。您可以测试您访问的每个值,看看它是否相关。
一个明显的优化是尽量减少必须遍历的多余数据的数量。这在很大程度上取决于您在数据中穿过的“接缝”数量——“Z”曲线必须进行较大跳跃才能继续其路径的位置(例如,从 Z 值 31 到下面的 32)。
这可以通过使用BIGMIN
和LITMAX
函数来识别这些接缝并导航回矩形来缓解。为了尽量减少我们评估的不相关数据的数量,我们可以:
-
记录我们访问过的连续垃圾数据的数量。
确定此计数的最大允许值 (
maxConsecutiveJunkData
)。顶部链接的博文使用3
作为该值。
如果连续遇到maxConsecutiveJunkData
不相关的数据,我们会发起BIGMIN
和LITMAX
。重要的是,在我们决定使用它们时,我们现在位于线性搜索空间内(Z 值 12 到 45)但在矩形搜索空间之外。在***的文章中,他们似乎选择了maxConsecutiveJunkData
值4
;他们从 Z=12 开始,一直走到矩形之外的 4 个值(超过 15),然后才决定现在是使用 BIGMIN
的时候了。因为maxConsecutiveJunkData
任你选择,BIGMIN
可用于线性范围内的任何值(Z 值 12 到 45)。有点令人困惑的是,这篇文章仅将 19 岁以后的区域显示为交叉阴影线,因为这是当我们使用 BIGMIN
和 4 的 maxConsecutiveJunkData
时将优化的搜索子范围。
当我们意识到我们已经在矩形之外游荡得太远了,我们可以得出结论,矩形是不连续的。 BIGMIN
和 LITMAX
用于识别拆分的性质。 BIGMIN
旨在给定线性搜索空间中的任何值(例如 19),找到将回到具有较大 Z 值的分割矩形的一半内的下一个最小值(即,将我们从 19 跳到 36)。 LITMAX
类似,帮助我们找到最大的值,它将位于 Z 值较小的分割矩形的一半内。 BIGMIN
和 LITMAX
的实现在链接博文的zdivide
函数解释中进行了深入解释。
【讨论】:
raima.com 的链接已损坏。它可以在 WayBack 机器上找到,地址为web.archive.org/web/20180311015006/https://docs.raima.com/rdme/…。 另见relevant paper,这可能是其他来源的基础。它的可读性很好。 另一个不错的链接,在 raima.com 上仍然有效(但内容与上面的链接不同):raima.com/wp-content/uploads/…以上是关于如何在范围搜索中使用莫顿阶(z阶曲线)?的主要内容,如果未能解决你的问题,请参考以下文章
Android UI贝塞尔曲线 ① ( 一阶贝塞尔曲线 | 二阶贝塞尔曲线 )