【问题标题】:Mapping two integers to one (with an upperbound)将两个整数映射为一个(有上限)
【发布时间】:2018-03-25 17:24:54
【问题描述】:

我正在寻找一个将两个(正)整数映射为一个新整数的函数,该整数可以反转为原始组合。 这个问题之前已经问过,例如Mapping two integers to one, in a unique and deterministic way。不同之处在于其中一个整数绑定到一个非常小的上限,例如 50。另一个整数未绑定。

我要解决的是,我有 1-50 个数组,数字为 1 - max int(但大多

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 为界,但我不知道如何。

【问题讨论】:

  • 显然只有在两者都有界的情况下才能做到,因为int是有界的
  • “我很快就能得到巨大的数字” - 比 BigInteger 还要大?
  • 例如,如果一个部分从 1 - max int 开始,那么只能填充 1 个额外的位..
  • 是的,两者都是有界的。但是一个在 1-50 之间,另一个在 1-MaxInt 之间。 @Sinatr:如果您将 Cantor Pairing 与例如 100000,4 一起使用,您将得到 5000450014。哪个有效,但在 200000 时,您已经溢出 int32 (20000900014)
  • 事情是 1..MaxInt 需要 31 位,1..50 需要 6 位,并且 (31+6)>32,所以不可能同时将两个数字存储在 32 位中。

标签: c# algorithm math integer mapping


【解决方案1】:

如果你有两个数字

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

【讨论】:

  • 但是 OP 有 a_max = 2^31 这意味着 b 的范围可以从 0 到 1 - 但他希望 b 的范围从 1..50
  • 是的,b 也必须有界,否则没有更大的类型是不可能的。 But it seems a bound may be acceptable for the OP
  • 谢谢。它看起来很简单,但它正是我想要的。
猜你喜欢
  • 1970-01-01
  • 2012-07-17
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 2011-09-28
  • 1970-01-01
  • 1970-01-01
  • 2020-09-02
相关资源
最近更新 更多