2017-10-13 13 views
2

2 개의 (양의) 정수를 하나의 새로운 정수로 매핑하는 함수를 찾고 있는데, 원래의 조합으로 되돌릴 수 있습니다. 이전에 질문이 제기되었습니다 (예 : Mapping two integers to one, in a unique and deterministic way). 차이점은 정수 중 하나가 매우 작은 상한에 바인딩된다는 것입니다 (예 : 50). 다른 정수는 언 바운드입니다.2 개의 정수를 하나에 매핑하기 (상한으로)

내가 해결하려고하는 것은 숫자 1 - 최대 int (하지만 주로 < 10.000.000)와 1-50 배열을 가지고 있다는 것입니다.

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에 묶여 있기 때문에 가능해야한다고 생각하지만 방법을 알 수는 없습니다.

+1

int가 한정되어 있기 때문에 양쪽 모두가 한정되어있을 때만 명확하게 처리 할 수 ​​있습니다. – harold

+0

* "BigInteger"보다 큽니다. (https://msdn.microsoft.com) /en-us/library/system.numerics.biginteger(v=vs.110).aspx)? – Sinatr

+0

예를 들어, 한 부분이 1 - max int가되면, 여분의 비트 1 개만 채울 수 있습니다. – harold

답변

0

두 개의 숫자

  • a이있는 경우 0 a_max로에서 - 32/a_max 2-0에서
  • b 1-

    1

당신은

로 결합 할 수 있습니다
x = a + a_max*b; 

이고 결합 된 숫자 x은 32 비트 부호없는 정수에 맞습니다. 가능한 모든 출력 값이 사용되기 때문에이를 디코딩하려면

a = x%a_max; 
b = x/a_max; 

보다 효율적인 포장을 찾을 수 없습니다

를 사용합니다. 출력에 '갭'이 없습니다. b의 경계가 너무 좁 으면 출력 유형을 더 크게 사용해야합니다.

+0

그러나 OP는'a_max' = 2^31을 가지고 있는데 이는'b'가 0에서 1까지 범위를 가질 수 있음을 의미합니다 -하지만 그는'b'가 1.50에서 범위를 원한다면 –

+0

네,'b'도 역시 묶여 야합니다. 그렇지 않으면 더 큰 유형 없이는 불가능합니다. [그러나 그것은 경계가 OP를 위해 받아 들여질 것 같다] (https://stackoverflow.com/questions/46732213/mapping-two-integers-to-one-with-an-upperbound/#comment80411661_46732213) – alain

+0

고마워. 그것은 너무 단순 해 보이지만 정확히 내가 원하는 것을합니다. – Joeri