【发布时间】: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