2017-10-13 44 views
2

我正在尋找一個將兩個(正數)整數映射爲一個新整數的函數,該整數可以反轉爲原始組合。 之前已詢問過該問題,例如Mapping two integers to one, in a unique and deterministic way。區別在於其中一個整數被綁定到一個非常小的上限,例如50.另一個整數是未綁定的。將兩個整數映射到一個(使用上限)

我試圖解決的是,我有1-50數組1 - 最大整數(但主要是< 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而不是一長。我認爲這應該是可能的,因爲我的一對數字中有一個數字是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 - 1
  • b從0到2 /a_max - 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

相關問題