编辑: AWS 数据库博客现在详细介绍了这个主题。
这篇博文很好地说明了这个过程。
搜索矩形空间时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
and LITMAX
。重要的是,在我们决定使用它们时,我们现在位于线性搜索空间内(Z 值 12 到 45)但在矩形搜索空间之外。在 Wikipedia 文章中,他们似乎选择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