2017-10-13 32 views
2

Je cherche une fonction qui mappe deux entiers (positifs) en un seul nouvel entier, qui peut être inversé à la combinaison d'origine. La question a déjà été posée, par exemple Mapping two integers to one, in a unique and deterministic way. La différence est que l'un des entiers est lié à une borne supérieure qui est assez petite, par exemple 50. L'autre entier est non lié. Ce que j'essaie de résoudre est que j'ai et 1-50 tableaux avec des nombres 1 - max int (mais surtout < 10.000.000).Mappage de deux entiers à un (avec une borne supérieure)

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) 

Maintenant, je veux créer un nouveau tableau qui combine ces tableaux N à un seul nouveau tableau, où chaque numéro est reversible au tableau d'origine. J'ai donc pensé à créer des paires, un nombre pointant vers le tableau et un vers le nombre réel dans le tableau. Si j'utilise les fonctions par défaut comme Cantor Pairing Function, je reçois des nombres énormes très rapidement, et j'essaie de garder ces nombres aussi petits que possible. Ce serait de préférence si la plus grande partie pouvait simplement contenir un Int32 au lieu d'un long. Je pense que cela devrait être possible parce que l'un des nombres de ma paire est limité à 50, mais je n'arrive pas à comprendre comment.

+1

Cela ne peut clairement être fait que si les deux sont bornés, parce que 'int' est bornée – harold

+0

*" Je reçois des nombres énormes très rapidement "* - plus grand que [' BigInteger'] (https://msdn.microsoft.com /en-us/library/system.numerics.biginteger(v=vs.110).aspx)? – Sinatr

+0

Par exemple, si une partie passe de 1 à max int, alors seulement 1 bit supplémentaire peut être introduit. – harold

Répondre

0

Si vous avez deux numéros

  • a de 0 à a_max - 1
  • b de 0 à 2 /a_max - 1

vous pouvez les combiner comme

x = a + a_max*b; 

et le nombre combiné x s'insérera dans un entier non signé de 32 bits.

Pour les décoder, utilisez

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

Il est impossible de trouver un emballage plus efficace, parce que chaque valeur de sortie possible est utilisée. (Il n'y a pas de «trous» dans la sortie.) Si les limites pour b sont trop étroites, un type de sortie plus grand doit être utilisé.

+0

Mais l'OP a 'a_max' = 2^31 ce qui signifierait que' b' pourrait aller de 0 à 1 - mais il veut 'b' aller de 1..50 –

+0

Oui,' b' doit aussi être borné, sinon c'est impossible sans un type plus grand. [Mais il semble qu'une limite peut être acceptable pour l'OP] (https://stackoverflow.com/questions/46732213/mapping-two-integers-to-one-with-an-upperbound/#comment80411661_46732213) – alain

+0

Merci. Cela semble si simple, mais ça fait exactement ce que je cherchais. – Joeri