如何在范围搜索中使用Morton Order(z order curve)?

时间:2015-05-11 14:46:47

标签: z-order-curve

如何在范围搜索中使用Morton Order? 从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)是否有任何网络博客演示如何进行范围搜索?

2 个答案:

答案 0 :(得分:7)

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

This blog post能够合理地说明这一过程。

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

  1. 最小Z值(12)是通过交错最低xy值的位来找到的:分别为2和2。
  2. 通过交错最高xy值的位来找到最大Z值(45):3和6。
  3. 找到最小和最大Z值(12和45)后,我们现在可以迭代一个线性范围,保证包含矩形空间内的所有条目。线性范围内的数据将成为我们实际关注的数据的超集:矩形空间中的数据。如果我们只是遍历整个范围,我们将找到我们关心的所有数据,然后是一些。您可以测试您访问的每个值,看它是否相关。
  4. 显而易见的优化是尽量减少必须遍历的多余数据量。这很大程度上取决于您在数据中交叉的“接缝”数量 - “Z”曲线必须进行大跳跃以继续其路径的位置(例如,从Z值31到32以下)。

    Z Order Curve range traversal

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

    1. 记下我们访问过的连续垃圾数据的数量。
    2. 确定此计数的最大允许值(maxConsecutiveJunkData)。在顶部链接的博客文章使用3获取此值。
    3. 如果我们连续遇到maxConsecutiveJunkData条不相关的数据,我们会发起BIGMINLITMAX。重要的是,在我们决定使用它们的时候,我们现在位于线性搜索空间(Z值为12到45)之内,而之外的矩形搜索空间。在维基百科文章中,他们似乎选择了maxConsecutiveJunkData 4的值;他们从Z = 12开始,一直走到矩形之外的4个值(超过15),然后才决定现在是时候使用BIGMIN了。由于maxConsecutiveJunkData符合您的口味,BIGMIN可用于线性范围内的任何值(Z值12到45)。有点令人困惑的是,文章只显示了19岁以上的区域为交叉阴影线,因为当我们使用BIGMINmaxConsecutiveJunkData为4时,搜索的子范围将被优化。
    4. 当我们意识到我们已经在矩形之外走得太远时,我们可以得出结论,矩形是非连续的。 BIGMINLITMAX用于标识拆分的性质。 BIGMIN被设计为,给定线性搜索空间中的任何值(例如19),找到将返回具有较大Z值的分割矩形的一半内的下一个最小值(即,将我们从19跳到36) )。 LITMAX类似,帮助我们找到具有较小Z值的分割矩形的一半内的最大值。 BIGMINLITMAX的实现在链接博客文章的zdivide函数说明中进行了深入解释。

答案 1 :(得分:0)

似乎维基百科文章中引用的示例尚未经过编辑以澄清背景和假设。该示例中使用的方法适用于仅允许顺序(向前和向后)搜索的线性数据结构;也就是说,假设人们不能仅使用其莫顿指数在恒定时间内随机寻找存储单元。

有了这个约束,一个人的策略从一个全范围开始,即最小莫顿指数(16)和最大莫顿指数(45)。为了进行优化,人们试图找到并消除查询矩形之外的大量子范围。图中的阴影区域表示如果未应用此类优化(消除子范围),将会(按顺序)访问的内容。

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