给出三个整数:x,y,z。 我想找到分页函数F:(x,y,z) - > N,其中N是自然数。 也就是说,我想编号所有这些3元素的元组。
我听说过Cantor编号,但还有其他选项可以快速计算并给出足够大的值吗?
P.S。我想构建一个哈希
答案 0 :(得分:3)
您可能会考虑Z-order curve的3D变体。使用位算术计算三重态的Morton指数相当容易。 示例:
X = xk..x1x0 (binary bits)
Y = yl..y1y0 (binary bits)
Z = zm..z1z0 (binary bits)
3D index(X,Y,Z) = (...z1y1x1z0y0x0)
X=2=10b, Y=3=11b, Z=4=100b
I = 100 011 010 b = 282 dec
答案 1 :(得分:1)
Cantor编号(如OP中所述)命令对(x,y)
如下:
0,0
0,1
1,0
0,2
1,1
2,0
...
也就是说,这些对首先按其总和排序,然后按第一个元素排序。可以很容易地计算给定对的索引:
C(x,y) = ((x + y)2 + x + y)/2 + x
您可以通过各种方式将它概括为更大的元组,但一个简单的方法是按顺序应用编号:
C3(x,y,z) = C(C(x,y),z)
Cantor编号有两个主要优点:
它不依赖于将值限制在给定范围内。
这是一个紧凑的编号,所以指数不会增长太快。
答案 2 :(得分:0)
只要x, y, z
为低值或中值,哈希方法就可以这样工作:
x,y,z < 1000
时的示例:
x*1000*1000 + y*1000 + z
答案 3 :(得分:0)
如果您的值不是太大,可以使用Gödel-numbering。
在你的情况下:
F(x,y,z) = 2^x * 3^y * 5^z; // ^ means power function (not xor)
计算起来不是很便宜(因为使用了幂函数),但它保证是injective(=&gt;无碰撞散列函数)。
答案 4 :(得分:0)
如果x,y,z
每个都可以由n
位表示,则可以构造一个由3n
位组成的数字,这将是x,y,z
位的串联:第一个n
位代表x
,然后位n+1
到2n
代表y
,2n+1
代表3n
代表z
。
在这种情况下(x,y,z
可以用n
位表示),您最多可以((2^n)^3) = 2^3n
组合x,y,z
,因此这对f
输出的大小(以位为单位)(您将无法使用比3n
少得多的位来表示f
的输出。