我正在寻找一个将两个(正)整数映射为一个新整数的函数,该整数可以反转为原始组合。 这个问题之前有人问过,比如Mapping two integers to one, in a unique and deterministic way .区别在于其中一个整数绑定(bind)到一个非常小的上限,例如 50。另一个整数未绑定(bind)。
我要解决的问题是我有 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 为界,但我不知道如何。
最佳答案
如果你有两个数字
a
从 0 到a_max
- 1b
从 0 到 232/a_max
- 1
你可以把它们组合成
x = a + a_max*b;
和组合数 x
将适合 32 位无符号整数。
解码它们,使用
a = x%a_max;
b = x/a_max;
不可能找到更有效的打包方式,因为每个可能的输出值都被使用了。 (输出中没有“间隙”。)如果 b
的边界太窄,则必须使用更大的输出类型。
关于c# - 将两个整数映射到一个(有上限),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46732213/