为什么使用位交错而不是按高位和低位来对数字进行配对?
Why pair numbers using bit interleaving instead of separating by high and low bits?
我最近了解到Morton coding (Z-order curve) as a bitwise pairing function. It was presented to me as a computationally faster way to pair numbers compared to the Cantor pairing function。
莫顿编码的工作方式是通过交错位组合两个数字并将结果存储在更广泛的数据类型中。例如,将两个8位整数的位交错,将结果存储为16位整数。
为什么要交错位而不是将两个数字拆分为目标数据类型的高位和低位?我希望使用高位和低位会更快。什么时候交错使用它们会有优势?
与 Cantor 配对函数一样,但与级联不同的是,它不会在坐标上放置先验边界。换句话说,莫顿编码也可以为任意长度的整数制定。这实际上不是连接的情况,因为虽然任何东西都可以连接,但结果将是模棱两可的,其解释将取决于坐标的原始大小。除一维外的所有维度的大小都必须固定以避免歧义。
如果在存在先验界限的上下文中使用它,并且局部性不是问题,那么连接当然是一个更简单的选项。
不过,位置是一个常用的优势。靠近的两个坐标在其 Z 值方面也大多映射得相对较近。 Hilbert 曲线为此目的工作得更好,但更难编码、解码和偏移(并且像串联一样,它也取决于必须预先固定的 space 的大小)。级联坐标仅在一个维度(但确实很好)而不是其他维度保留局部性,但最容易 encode/decode/offset (当这些事情完全可能时,这意味着除一维外的所有维度的大小必须预先确定)。
我最近了解到Morton coding (Z-order curve) as a bitwise pairing function. It was presented to me as a computationally faster way to pair numbers compared to the Cantor pairing function。
莫顿编码的工作方式是通过交错位组合两个数字并将结果存储在更广泛的数据类型中。例如,将两个8位整数的位交错,将结果存储为16位整数。
为什么要交错位而不是将两个数字拆分为目标数据类型的高位和低位?我希望使用高位和低位会更快。什么时候交错使用它们会有优势?
与 Cantor 配对函数一样,但与级联不同的是,它不会在坐标上放置先验边界。换句话说,莫顿编码也可以为任意长度的整数制定。这实际上不是连接的情况,因为虽然任何东西都可以连接,但结果将是模棱两可的,其解释将取决于坐标的原始大小。除一维外的所有维度的大小都必须固定以避免歧义。
如果在存在先验界限的上下文中使用它,并且局部性不是问题,那么连接当然是一个更简单的选项。
不过,位置是一个常用的优势。靠近的两个坐标在其 Z 值方面也大多映射得相对较近。 Hilbert 曲线为此目的工作得更好,但更难编码、解码和偏移(并且像串联一样,它也取决于必须预先固定的 space 的大小)。级联坐标仅在一个维度(但确实很好)而不是其他维度保留局部性,但最容易 encode/decode/offset (当这些事情完全可能时,这意味着除一维外的所有维度的大小必须预先确定)。