Algorithm 编号三元组

Algorithm 编号三元组,algorithm,math,hash,Algorithm,Math,Hash,给定三个整数:x,y,z。 我想找到分页函数F:(x,y,z)->N,其中N是一个自然数。 也就是说,我想对所有3个元素的元组进行编号 我听说过Cantor编号,但还有其他选项可以快速计算并给出足够大的值​​? 我想构造一个散列,因此 你可以考虑3D变体。用位算法计算三重态的莫顿指数是相当容易的。 例如: X = xk..x1x0 (binary bits) Y = yl..y1y0 (binary bits) Z = zm..z1z0 (binary bits) 3D index(X,Y

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

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


我想构造一个散列,因此

你可以考虑3D变体。用位算法计算三重态的莫顿指数是相当容易的。 例如:

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

你可以考虑3D变体。用位算法计算三重态的莫顿指数是相当容易的。 例如:

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

只要
x,y,z
是低值或中值,哈希方法就可以这样工作:

x,y,z<1000
时的示例:

x*1000*1000 + y*1000 + z

只要
x,y,z
是低值或中值,哈希方法就可以这样工作:

x,y,z<1000
时的示例:

x*1000*1000 + y*1000 + z

如果您的值不是太大,您可以使用

就你而言:

F(x,y,z) = 2^x * 3^y * 5^z;   // ^ means power function (not xor)

计算起来并不便宜(因为使用幂函数),但它保证是(=>无冲突哈希函数)

如果您的值不是太大,您可以使用

就你而言:

F(x,y,z) = 2^x * 3^y * 5^z;   // ^ means power function (not xor)

计算起来并不便宜(因为使用幂函数),但它保证是(=>无冲突哈希函数)

如果
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
的输出).

如果
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
)的输出。

康托编号(如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)

康托编号有两大优势:

  • 它不依赖于将值限制在给定范围内

  • 它是一个紧凑的编号,因此索引不会增长太快

  • 康托编号(如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)

    康托编号有两大优势:

  • 它不依赖于将值限制在给定范围内

  • 它是一个紧凑的编号,因此索引不会增长太快


  • 只要
    a,b,c in(-10001000)
    (如果您知道您的值在有效范围内,则快速简单的解决方案)。只要
    a,b,c in(-10001000)
    (如果您知道您的值在有效范围内,则快速简单的解决方案)。f(x,y,z)是否应等于f(y,x,z)?(等等)否,f(x,y,z)!=f(y,x,z)f(x,y,z)应该等于f(y,x,z)吗?(等等)不,f(x,y,z)!=f(y,x,z)很好,看起来不错。我知道如何将其应用于两个数字。您能演示如何为三个数字执行此操作吗?@Dima00782示例ADDEXCELLENT,看起来不错。我知道如何将其应用于两个数字。您能演示如何为三个数字执行此操作吗?@Dima00782示例ADDEXCELLENT