gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:04:59 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com