将两个整数映射到一个(使用上限)
问题描述:
我正在寻找一个将两个(正数)整数映射为一个新整数的函数,该整数可以反转为原始组合。 之前已询问过该问题,例如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,但我无法弄清楚。
答
如果你有两个数字
-
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
的范围太窄,则必须使用更大的输出类型。
只有在两者都有界的情况下才能做到这一点,因为'int'是有界的 – harold
*“我得到的数字非常快”* - 比['BigInteger']大(https://msdn.microsoft.com /en-us/library/system.numerics.biginteger(v=vs.110).aspx)? – Sinatr
例如,如果一个部分从1到max int,则只能添加1个额外位。 – harold