如何在范围搜索中使用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)是否有任何网络博客演示如何进行范围搜索?
答案 0 :(得分:7)
编辑: AWS数据库博客现在有a detailed introduction to this subject。
This blog post能够合理地说明这一过程。
搜索矩形空间x=[2,3], y=[2,6]
时:
x
和y
值的位来找到的:分别为2和2。x
和y
值的位来找到最大Z值(45):3和6。显而易见的优化是尽量减少必须遍历的多余数据量。这很大程度上取决于您在数据中交叉的“接缝”数量 - “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
且maxConsecutiveJunkData
为4时,搜索的子范围将被优化。当我们意识到我们已经在矩形之外走得太远时,我们可以得出结论,矩形是非连续的。 BIGMIN
和LITMAX
用于标识拆分的性质。 BIGMIN
被设计为,给定线性搜索空间中的任何值(例如19),找到将返回具有较大Z值的分割矩形的一半内的下一个最小值(即,将我们从19跳到36) )。 LITMAX
类似,帮助我们找到具有较小Z值的分割矩形的一半内的最大值。 BIGMIN
和LITMAX
的实现在链接博客文章的zdivide
函数说明中进行了深入解释。
答案 1 :(得分:0)
似乎维基百科文章中引用的示例尚未经过编辑以澄清背景和假设。该示例中使用的方法适用于仅允许顺序(向前和向后)搜索的线性数据结构;也就是说,假设人们不能仅使用其莫顿指数在恒定时间内随机寻找存储单元。
有了这个约束,一个人的策略从一个全范围开始,即最小莫顿指数(16)和最大莫顿指数(45)。为了进行优化,人们试图找到并消除查询矩形之外的大量子范围。图中的阴影区域表示如果未应用此类优化(消除子范围),将会(按顺序)访问的内容。
在讨论线性顺序数据结构的主要优化策略之后,继续讨论具有更好搜索能力的其他数据结构。