编号三元组

时间:2014-03-05 12:01:10

标签: algorithm math hash

给出三个整数:x,y,z。 我想找到分页函数F:(x,y,z) - > N,其中N是自然数。 也就是说,我想编号所有这些3元素的元组。

我听说过Cantor编号,但还有其他选项可以快速计算并给出足够大的值吗?

P.S。我想构建一个哈希

5 个答案:

答案 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编号有两个主要优点:

  1. 它不依赖于将值限制在给定范围内。

  2. 这是一个紧凑的编号,所以指数不会增长太快。

答案 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+12n代表y2n+1代表3n代表z

在这种情况下(x,y,z可以用n位表示),您最多可以((2^n)^3) = 2^3n组合x,y,z,因此这对f输出的大小(以位为单位)(您将无法使用比3n少得多的位来表示f的输出。