Algorithm 编号三元组
给定三个整数:x,y,z。 我想找到分页函数F:(x,y,z)->N,其中N是一个自然数。 也就是说,我想对所有3个元素的元组进行编号 我听说过Cantor编号,但还有其他选项可以快速计算并给出足够大的值?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
我想构造一个散列,因此 你可以考虑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)
康托编号有两大优势:
(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