Je veux convertir une séquence de nombres en un numéro unique qui conservera des valeurs individuelles ainsi que leur position. par exemple. La séquence suivante est fournie - P>
1,6,7,8,9,45,67 p> blockQuote>
Ici, prenez par exemple, si j'applique une addition simple, I.E. 1 + 6 + 7 + 8 + 9 + 45 + 67, un nombre sera généré. Mais de ça non. Nous ne pouvons pas extraire les chiffres individuels avec leur commande [i.e. 1,6,7,8,9, ...]. p>
Y a-t-il un moyen de réaliser cette fonctionnalité sans aucune déduction ambiguë [I.e 1 jeu de numéros unique sera extraite d'un numéro.]? Y a-t-il une fonction mathématique qui sera utile pour récupérer les éléments individuels de ce nombre? P>
8 Réponses :
Vous pouvez convertir cela en un numéro de base-n, où n est une plus grande que la valeur la plus importante qui apparaîtra dans votre séquence d'entrée. P>
Basé sur les différents commentaires, je voudrais proposer une solution alternative qui peut être plus facile à mettre en œuvre. Vous pouvez envisager la séquence d'être une chaîne codée UTF-8 et utiliser Huffman coding avec une coutume Dictionnaire pour atteindre une représentation compacte. P>
Le dictionnaire personnalisé vous permet de stocker des caractères très fréquents avec très peu de bits (par exemple, le séparateur de séquence ',' et les caractères individuels '0' .. '9' peuvent être stockés avec aussi peu que 3 bits, mais De plus, d'autres chiffres que vous trouvez statistiquement susceptibles de se produire peuvent être stockés dans une séquence de bits courte. Par exemple, si vous trouvez que "42" se produit fréquemment, vous pourriez stocker "42" en quelques bits. P>
Si vous n'attribuez que des codes spéciaux à ',' et '0' à '9', vous aurez moyennu moins de 4 bits par caractère dans la chaîne d'entrée tout en conservant les éléments de séquence de séparation des virgules. Trouver des substrings courants, multi-caractères et les ajout au dictionnaire n'améliorera que sur ce rapport. P>
Utilisation d'un dictionnaire personnalisé signifie également que vous faites pas em> devez stocker le dictionnaire dans l'en-tête des données compressées, car il est bien connu de vous. P>
J'ai fait quelque chose comme ça à l'aide de Sharpziplib P>
http://www.icshaarpcode.net/opensource/sharpziplib/ p>
http://community.shaparpdevelop.net/forums/p/8255 /23219.aspx P>
Il est également facile de faire avec zlib p>
Pouvez-vous expliquer un peu avec un exemple de prise de la séquence de nos NOS. comme prévu en question?
@Debadyutimaiti c'est fait tout le temps, mais il est tellement câblé en ce que cela ne se produit pas. Notez un nombre décimal (base-10), dites: 9142 code>. Il existe 4 chiffres distincts séparables uniquement en fonction de la position: comment? :)
@pst Oui.Mais que vous envisagez uniquement de chiffres. [I.E 9,1,4,2] mais je envisageons nos numéros. Comme 45,67 aussi.Comment-tu les traiter [comme chiffre] alors?
@Debadyutimaiti c'est la même chose. La seule différence est que l'on a été câblée depuis l'école de grade :) Développez le numéro d'un hexadécimal: 12f code>, qui est la base-16. Encore une fois, chaque chiffre est particulièrement séparable en fonction de la position: comment? Maintenant, imaginez un système de numérotation où chaque chiffre i> peut être compris entre
(0) code> (une valeur de 0) sur
(43) code> (A Valeur de 43) et les chiffres sont écrits comme:
(1) (42) (4) code>. Chaque chiffre est particulièrement séparable en fonction de la position: comment?
SexageMLL est toujours utilisé pour parler de géo-coordonnantes. Je pense que Base d'un système de numéraire pourrait être un bon point de départ ..
@pst supposons qu'un numéro soit formé (420) dans la base 10.Quand converti en base 42, puis non. serait (10) (0). Quand vous convertiez le non. Retour à la base 10, vous reviendrez à nouveau 420.Avoir la façon dont vous envisagez exactement d'obtenir les éléments individuels d'une séquence du nombre 420? Est-ce 4,20 ou 42,0 ou 4,2,0?
@Debadyutimait bien, base-10 n'est qu'un moyen de voir i> un nombre où chaque chiffre est donné un certain poids (10). Bien sûr que même numéro i> pourrait être visualisé i> comme base-2 ou base-16 ou base-420 (il ne change pas le nombre, juste la manière dont le nombre est représenté ). Eric se disput d'afficher la base de base d'entrée-N telle que chaque numéro d'entrée de la séquence est un chiffre séparé.
"Convertir ceci en nombre de base-n", comment vous récupérerez n code> quand vous voulez faire inverser? S'il y avait un moyen de sauvegarder quelque chose pour le récupérer plus tard, vous pouvez simplement enregistrer des chiffres dans la chaîne ou la matrice, ce qui est plus rapide, mais ils prendront plus de mémoire.
@Saeedamiri: Vous pouvez toujours convertir entre deux bases de nombre. Disons que le plus grand nombre dans votre séquence d'entrée est de 15, vous sélectionnez donc la base 16 comme votre représentation (cela peut commencer à sembler familier). Utilisons des symboles A pour 10, B pendant 11, etc. Maintenant, le nombre A3B dans la base 16 (également appelé hexidécimal) serait converti en base 10 à l'aide de la formule: 10 * 16 ^ 3 + 3 * 16 ^ 2 + 11 * 16 ^ 0 (ici 16 ^ N signifie 16 élevés à la puissance de n). La base 16 n'est qu'un exemple familier. Vous pouvez faire la même chose avec n'importe quelle base de numéro.
@Ericj. J'ai dit comment enregistrer le plus grand nombre (le numéro que vous avez utilisé comme numéro de base), je ne parle pas comment convertir d'une base à une autre.
La solution optimale dépend de votre cas d'utilisation. Si les chiffres de votre séquence d'entrée peuvent vraiment être tout numéro entier i>, la solution est différente de celle-ci. Par exemple, si vous lisiez des points de données à partir d'un périphérique qui vous donnera toujours des objets dans la plage 0..1024, la réponse est très différente de celle que si vous attendez des entiers entièrement aléatoires. Pouvez-vous partager la nature des chiffres que vous verrez?
Également offert une solution alternative.
mis à jour pour vérifier le cas 0,1. p>
Séparez les différents nombres par 001. P>
Pour éviter toute confusion avec 00 à l'intérieur de vos numéros, chaque fois qu'un 0 apparaît dans vos numéros, remplacez-le par 01. P>
Pour décoder, scinder par 001. Remplacez tout 01 par 0. P>
Ah ... je pensais au rembourrage plutôt que de diviser. Que diriez-vous de 1 900900900, 2
1,0 ne fonctionne pas, car il a le même encodage que 10,1. Ce n'est pas réversible.
Ce genre de chose ne va pas fonctionner. Un contre-exemple plus facile à la nouvelle idée: 10013,7. Le codage est 100130017. C'est aussi le codage de 1 30017.
@Seanowen non, 10013,7 codé est 10101130017. Encodage pour 1 30017 est 1001301017. Chaque fois que vous le voyez 001, c'est une pause.
Vous ne pouvez pas, si la plage de vos numéros est infinie. P>
Le jeu de puissance de nombres naturels en indénombrable. Cela signifie que vous ne pouvez pas fournir de mappage entre des ensembles de nombres et de chiffres. P>
Ce que vous pourriez faire si vos chiffres sont limités à, disons 32 bits, concaténent les chiffres en un long numéro binaire et les stocker comme une séquence d'octets, peut-être comme un Bignum. P>
Si les membres Si la séquence d'entrée ne sont pas infinies, vous le pouvez sûrement. Par exemple, si le plus grand numéro d'entrée est 9, vous pouvez écrire sans ambiguïté 1,0,0,9 comme 1009
Disons que votre séquence est appelée alors le premier chiffre de votre résultat est Cela fonctionne pour des chiffres avec au plus 9 chiffres. P> s code>
et je définirai
len (n) code> pour être le nombre de chiffres en n. p>
len (s [0]) code>,
et ce qui suit
len (s [0]) code> chiffres est le numéro
s [0] code>;
Ensuite, vous appendez
len (s [1]) code> et
s [1] code>, et ainsi de suite. P>
Pourraient être étendus à des chiffres de longueur arbitraire soit en codant sur la longueur à deux chiffres (qui vous permettraient de vous accéder à 19 chiffres) ou d'un schéma de codage de longueur plus complexe. Par exemple, vous pouvez mettre dans len (len (s [1])) code> en tant que chiffre,
len (s [1]) code> avec le nombre de chiffres spécifié entre 1 et 9, puis
s [1] code>; Cela fonctionne pour des entiers non négatifs jusqu'à un milliard de chiffres.
S'ils sont tous des nombres positifs, le codage en zig-zag (de la gloire au tampon de protocole) pourrait les coder efficacement dans un bitstream.
Il est mathématiquement possible de le faire pour les séquences finies, mais pas très pratique car les chiffres nécessaires sont très rapidement très rapidement: il y a 67 7 sup> (environ 2 42 sup>) Longueur différente 7 séquences d'entiers de 1 ... 67, encore moins de séquences plus longues et d'entiers plus grands. P>
Pour un exemple simple d'une telle fonction, cartographier la séquence [1,6,7,8,9,45,67] à la valeur 2 1 sup> * 3 6 sup> * 5 7 sup> * 7 8 sup> * 11 9 sup> * 13 45 sup> * 17 67 sup>. Les bases sont les nombres premiers, les pouvoirs sont les éléments de la séquence. P>
Le mappage inverse est calculé par division - le nombre de fois que vous pouvez diviser votre valeur par Si vous souhaitez autoriser Goedel a utilisé des codages comme celui-ci dans sa preuve de ses théorèmes incomplétiques. P>
Comme Kendall Frey dit, il n'est pas possible de définir une fonction qui mappe chaque séquence infinie em> d'entiers à un entier différent. Il s'agit d'une conséquence de la preuve de Cantor selon laquelle le jeu de puissance des nombres naturels est indénombrable: vous ne pouvez même pas mapper injectivement toutes les séquences infinies d'éléments de Pour des approches plus pratiques, pensez en termes d'encodage de votre séquence d'entiers en tant que séquence d'octets, plutôt que comme un nombre. Une séquence finie d'octets peut facilement être considérée comme une valeur binaire, c'est donc un nombre, vous ne l'utilisez tout simplement pas vraiment comme tel. Une représentation commune de votre séquence d'exemple est la séquence d'octets: 2 code> est le premier élément de la séquence, etc. Le principal facteur premier de la valeur vous indique comment Longue la séquence est. P>
0 code> dans la séquence ainsi que des nombres positifs, ajoutez 1 à tous les éléments lorsque vous soulevez les nombres premiers aux pouvoirs. Ou utilisez alternativement la puissance de
2 code> pour donner la longueur de la séquence, commencez à encoder les éléments commençant par
3 code>. P>.
{vrai, faux} code> sur les entiers, sans parler de tous séquences infinies d'éléments des entiers. p>
[1,6,7,8,9,45,67] code>, utilisé par exemple dans JSON. Ceci est un nombre 136 bits. La fonction mathématique pour inverser cette cartographie implique des pouvoirs de modulo arithmétiques de 256, la soustraction du nombre 48, la multiplication de 10, et tellement: -) p>
Ouais. Et si vous mappiez les entiers de [0, 1, -1, 2, -2, 3, 3, ..] à [1, 2, 3, 4, 5, ..], etc. Vous pouvez aussi gérer des nombres négatifs aussi exactement de la même manière.
En effet. En général, pour tout ensemble dénombrable s code> vous avez d'abord cartographier les éléments de
S code> aux entiers positifs via une certaine injection, alors vous faites la chose que j'ai dit ci-dessus. Vous avez démontré une injection pour les entiers. En appliquant votre mappage, puis ma méthode deux fois, vous pouvez également encoder n'importe quelle séquence finie dont les éléments sont des séquences finies d'entiers.
Voici une implémentation de base PHP du Numérotation Godel Décrite par Steve Jessop Ci-dessus: Ce script ne fonctionne que pour les petits nombres en petites séquences. Il ne peut pas gérer de très grands nombres, je suppose que toute autre mise en œuvre. Il est encore plus facile et plus efficace de stocker des chiffres les concaténant comme suit: [01,05,15,17] -> 1051517. P> P>
Ceci utilise un Code universel , tel que elias oméga coding (ou tout code de préfixe - mais les codes universels sont des codes préfixaux avec certaines propriétés souhaitables). Un code de préfixe code une séquence de bits (c'est-à-dire un numéro) en tant que préfixe qui fournit essentiellement les informations nécessaires pour déterminer le nombre de bits constituant le reste du nombre. P>
1) Utilisez le code pour représenter le nombre d'éléments dans la séquence. 2) Utilisez ensuite le code pour représenter chaque élément. P>
Une autre réponse qui m'a eu lieu. Coder chaque numéro à Ternaire équilibré , avec deux bits par trit (par exemple, 0 = 00; +1 = 01; -1 = 10). La paire de bits restante (par exemple, 11) est la fin du marqueur d'élément, répété pour la fin de la séquence. Con: moins d'espace efficace que le code de préfixe lorsque des valeurs importantes sont attendues; Avantages: 1) Plus d'espace efficace avec la plupart des petites valeurs; 2) codage / décodage plus simple; 3) représente directement des valeurs négatives. P>
Sont-ils tous des entiers positifs?
@ Paddy3118 Juste pour l'instant, je considère que + VE numéros.Si vous pouvez le faire pour + Ve & -ve NOS. alors ce sera génial.
Quelle est la taille du numéro résultant? Il est possible de convertir un bitstream de longueur arbitraire en un nombre approprié (il pourrait s'agir d'un vraiment vraiment un nombre vraiment très long décimal avec des millions de chiffres i>). Il n'est pas possible de convertir tous les bits de bite en un numéro (par exemple et entier de type de données entier i>) d'une longueur finie: par exemple. 32 bits, 64 bits, 128-bits .. Et si vous traitez avec des flux (et non un de type de données entier i>), pourquoi le résultat doit-il être un "nombre"?