c# - 将两个整数映射到一个(有上限)

标签 c# algorithm math integer mapping

我正在寻找一个将两个(正)整数映射为一个新整数的函数,该整数可以反转为原始组合。 这个问题之前有人问过,比如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 - 1
  • b 从 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/

相关文章:

c++ - 为什么尽管具有相同的算法和数据结构,但另一个解决方案的效率却提高了 10 倍?

java - 寻找 vector 之间的符号角

c# - 如何从路径和文件名中删除非法字符?

c# 字典返回多个最小值最大值

c# - 将 _WTSClient 结构从 C++ 转换为 C#

c# - 在无限序列上创建 NUnit 测试

c++ - 在 C++ 中测量 popcount 函数的时间

algorithm - 如何模拟纳什均衡

c - 有符号整数加法,需要说明

java - 获取 sqrt 的第 n 位数字 : getting digits that exceed the double scope