将两个整数映射到一个(带有一个上限)

时间:2017-10-13 14:28:39

标签: c# algorithm math integer mapping

我正在寻找一个将两个(正)整数映射到一个新整数的函数,它可以反转为原始组合。 之前已经问过这个问题,例如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,但我无法弄清楚如何。

1 个答案:

答案 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的边界太窄,则必须使用更大的输出类型。