我正在寻找一个将两个(正)整数映射到一个新整数的函数,它可以反转为原始组合。 之前已经问过这个问题,例如Mapping two integers to one, in a unique and deterministic way。区别在于其中一个整数绑定到一个非常小的上限,例如50.另一个整数是未绑定的。
我想要解决的是,我有1-50个数字1 - max int(但大多数<10.000.000)。
array1 {1,2,3,4,5,6,7..N)
array2 {1,2,3,4,5,6,7..N)
array50 {1,2,3,4,5,6,7..N)
现在我想创建一个新的数组,它将这N个数组组合成一个新数组,其中每个数字都可以与原始数组相反。所以我考虑创建对,一个数字指向数组,一个数字指向数组中的实际数字。
如果我使用像Cantor Pairing Function这样的默认函数,我会非常快速地得到大数字,并且我试图保持这些数字尽可能小。 如果最大的部分恰好适合Int32而不是long,那将是最好的。我认为这应该是可能的,因为我的一对数字中的一个数字是50,但我无法弄清楚如何。
答案 0 :(得分:0)
如果您有两个号码
a
从0到a_max
- 1 b
从0到2 32 / a_max
- 1 您可以将它们组合为
x = a + a_max*b;
,组合数x
将适合32位无符号整数。
要解码它们,请使用
a = x%a_max;
b = x/a_max;
无法找到更有效的包装,因为使用了每个可能的输出值。 (输出中没有“间隙”。)如果b
的边界太窄,则必须使用更大的输出类型。