Answers:
区别在于映射保留本地性的程度以及对密钥进行编码/解码的难易程度。HV Jagadish的论文“具有多个属性的对象的线性聚类”说:“通过代数分析,并通过计算机模拟,我们表明,在大多数情况下,希尔伯特映射的表现与建议的最佳替代映射一样好,甚至更好。文献”。另一方面,z-order使用起来比较简单,例如,比较z-order的Bit Twiddling Hacks和Hilbert-order的Wikipedia中列出的各种方法。
对于应用程序,我认为使用空间填充曲线的主要优点是它们将点从较高维空间映射到较低维空间。例如,它们使使用传统的B树数据库索引对点进行窗口查询成为可能。同样,另一方面,缺点是,由于以后很难“调整”映射大小,因此需要提前知道输入范围。
PS:“ Z曲线”与“莫顿代码”相同。
当您沿着曲线线性“行走”时,这些空间填充曲线允许在多个维度上保持局部性。
从我所见,Z-Order(也称为Morton代码)是最常用的,因为它的计算成本是恒定的(且便宜),可以直接访问曲线的任何点。(并且易于在硬件中实现,周期损失为0,因为它对应于“仅切换”地址线)。
Z-Order曲线的一个具体示例是纹理模糊:基本上可以提高在GPU上读取纹理的缓存命中率。(请参阅有关Z曲线的文章中的图片https://en.wikipedia.org/wiki/Z-order_curve)
如果仅简单地线性存储纹理,则仅将纹理渲染为2D图像时,您将获得最大的缓存命中率,但是如果将其在屏幕上旋转90度,则会陷入最坏的情况(每次读取的纹理都会出现缓存未命中) 。
因此,最好进行一些权衡并降低最佳情况,并为大多数模式提供更好的缓存命中率。
作为个人笔记,据我所知,其他曲线的计算可能需要递归步骤,并导致比Z曲线更大的成本,并且在位置一致性方面的收益最小。因此,除了作为数学或创造性/有趣的渲染的研究主题之外,我还没有听说过将这些曲线用于实际目的。