将两个整数映射到一个(使用上限)

问题描述:

我正在寻找一个将两个(正数)整数映射为一个新整数的函数,该整数可以反转为原始组合。 之前已询问过该问题,例如Mapping two integers to one, in a unique and deterministic way。区别在于其中一个整数被绑定到一个非常小的上限,例如50.另一个整数是未绑定的。将两个整数映射到一个(使用上限)

我试图解决的是,我有1-50数组1 - 最大整数(但主要是< 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而不是一长。我认为这应该是可能的,因为我的一对数字中有一个数字是50,但我无法弄清楚。

+1

只有在两者都有界的情况下才能做到这一点,因为'int'是有界的 – harold

+0

*“我得到的数字非常快”* - 比['BigInteger']大(https://msdn.microsoft.com /en-us/library/system.numerics.biginteger(v=vs.110).aspx)? – Sinatr

+0

例如,如果一个部分从1到max int,则只能添加1个额外位。 – harold

如果你有两个数字

  • a从0到a_max - 1
  • b从0到2 /a_max - 1

,你可以将它们合并为

x = a + a_max*b; 

和组合号码x将适合32位无符号整数。

要对它们进行解码,使用

a = x%a_max; 
b = x/a_max; 

这是不可能找到一个更有效的包装,因为每一个可能的输出值被使用。 (输出中没有'间隙'。)如果b的范围太窄,则必须使用更大的输出类型。

+0

但是OP有'a_max' = 2^31这意味着'b'可以在0到1的范围内 - 但是他希望'b'的范围是1..50 –

+0

是的,'b'也必须是有界的,否则,没有更大的类型是不可能的。 [但它似乎有限的可能是OP](https://*.com/questions/46732213/mapping-two-integers-to-one-with-an-upperbound/#comment80411661_46732213) – alain

+0

谢谢。这看起来很简单,但它确实是我想要的。 – Joeri