IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Algorithmes et structures de données Discussion :

Changement de base décimal->binaire efficace !


Sujet :

Algorithmes et structures de données

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 4
    Points
    4
    Par défaut Changement de base décimal->binaire efficace !
    Bonjour,

    j'aimerais savoir quel est le meilleur algorithme de conversion décimal -> binaire.
    Je connais celui qui consiste a diviser par deux successivement ledit nombre et de conserver le reste de ces divisions.

    Cependant, il me semble qu'il existe un algorithme plus performant, c'est à dire dont la complexité serait inférieure à 0(n²), n étant le nombre de bits du nombre a convertir.

    Alex

  2. #2
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    En fait tu peux dans certaines conditions travailler à partir de données pré-calculés en 0(k) où k est le nombre de bits maximum dans lequel tu souhaites travailler.

    Il suffit de retrancher quand c'est possible la valeur 2^i (en commençant par k) à N, jusqu'à obtenir 0.

    Mais ça nécessite tout de même certains pré requis pas toujours disponibles :
    - Pourvoir représenter en machine toutes les puissances de 2 que l'on veut jusqu'à k (si k > 32 ça peut commencer à poser problèmes).
    - Pouvoir être sur qu'on peut déterminer un k (ne va-t'on pas devoir calculer autre chose de plus grand ?)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je vois... merci.
    donc je peux gagner un peu en complexité en enregistrant certaines puissances de 2.
    Effectivement si j'arrive à les enregistrer "toutes", ie jusqu'à un k au dela duquel je n'irai pas, c'est très intéressant.

    J'ai lu sur internet qu'on pouvait aussi passer par la base 256 (ou surement une autre), puis revenir en base 2 (256=2^8) simplement. qu'en pensez-vous ?

  4. #4
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    J'ai lu sur internet qu'on pouvait aussi passer par la base 256 (ou surement une autre), puis revenir en base 2 (256=2^8) simplement. qu'en pensez-vous ?
    En fait, ça ne change pas le problème. il faudra toujours convertir en base 2^n. de plus, le problème de la représentation des suites de base de 2^n est toujours existant.

    Néanmoins pour ce qui est de la conversion du nombre en base 2^n en un nombre en base 2 c'est effectivement trivial mais ça n'était pas le problème.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    D'accord.
    Le principal problème est, comme vous le dites, d'être certain d'avoir enregistré toutes les valeurs utiles (k) dans notre table pour pouvoir faire le calcul efficacement.

    La complexité devient-elle O(n) dans ce cas ?

    connaissez-vous un algorithme qui puisse s'affranchir du pré-enregistrement de valeurs ?

  6. #6
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    La complexité devient-elle O(n) dans ce cas ?
    C'est O(k) où k est la plus grande puissance de 2 possible.

    connaissez-vous un algorithme qui puisse s'affranchir du pré-enregistrement de valeurs ?
    Mis à part la division, je ne vois pas de méthode générale plus efficace pour passer d'une base b à une base p.

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Apparemment il s'agit d'un problème ouvert. Il y a un algorithme performant en ce moment, personne ne peut prouver qu'il est (ou non) le meilleur. Et de temps un temps un nouvel algorithme remplace le précédent.

    Lorsque vous dites O(k), vous considérez que les opérations de soustractions sont en temps constant ?

  8. #8
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Apparemment il s'agit d'un problème ouvert. Il y a un algorithme performant en ce moment, personne ne peut prouver qu'il est (ou non) le meilleur. Et de temps un temps un nouvel algorithme remplace le précédent.
    Tu parles de quel algo ?

    Lorsque vous dites O(k), vous considérez que les opérations de soustractions sont en temps constant ?
    En fait je considère que la complexité est fonction de k tout simplement. Et oui, je considère la soustraction à temps constant (sur une machine tu peux le considérer comme tel).

  9. #9
    Rédacteur
    Avatar de pseudocode
    Homme Profil pro
    Architecte système
    Inscrit en
    Décembre 2006
    Messages
    10 062
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Architecte système
    Secteur : Industrie

    Informations forums :
    Inscription : Décembre 2006
    Messages : 10 062
    Points : 16 081
    Points
    16 081
    Par défaut
    Citation Envoyé par namerif Voir le message
    Cependant, il me semble qu'il existe un algorithme plus performant, c'est à dire dont la complexité serait inférieure à 0(n²), n étant le nombre de bits du nombre a convertir.
    C'est une question générale, où c'est pour répondre à un problème spécifique ?

    Une méthode parmi d'autres, utiliser le fait que a*10 = a*(8+2) = (a<<3) + (a<<1)

    Et donc, par exemple

    x = 1537 = 1*1000+5*100 + 3*10 + 7 = ( ( ( ( (1*10) + 5 )*10 ) + 3 )*10 ) + 7

    x = 1
    x = (x<<3) + (x<<1)
    x = x + 5
    x = (x<<3) + (x<<1)
    x = x + 3
    x = (x<<3) + (x<<1)
    x = x + 7
    ALGORITHME (n.m.): Méthode complexe de résolution d'un problème simple.

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    Je parle de l'algo de conversion de la base 10 vers la base 2.

    Je considère que la soustraction, tout comme l'addition et la simple lecture de l'input, est de complexité O(n), n étant le nombre de bits de l'input. c'est assez arbitraire, mais ça permet de réduire cette complexité en prenant ce fait en compte.



    C'est une question générale, savoir quel est l'algorithme le plus performant en ce moment...
    à quoi correspond le "(a<<3) + (a<<1)" ?

  11. #11
    Expert éminent
    Avatar de PRomu@ld
    Homme Profil pro
    Ingénieur de Recherche
    Inscrit en
    Avril 2005
    Messages
    4 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Vienne (Poitou Charente)

    Informations professionnelles :
    Activité : Ingénieur de Recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Avril 2005
    Messages : 4 155
    Points : 6 486
    Points
    6 486
    Par défaut
    Ce sont des décalages de bits (ça revient à des multiplications par 2^p)

    Je considère que la soustraction, tout comme l'addition et la simple lecture de l'input, est de complexité O(n),
    Dans ce cas sans magie, impossible de faire plus bas, tu es obligé de lire tous les digits du nombre donc tu ne peux pas aller au dessous de O(n).

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 9
    Points : 4
    Points
    4
    Par défaut
    oui, je sais que je ne peux pas faire mieux que O(n); mais j'aimerais faire mieux que O(n²), qui est la complexté de l'algo de divisions successives par 2.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/01/2014, 22h36
  2. Réponses: 5
    Dernier message: 11/08/2006, 10h57
  3. changement de base de donnée
    Par Pitou5464 dans le forum Access
    Réponses: 3
    Dernier message: 08/08/2006, 14h37
  4. Changement de base...enfin je crois....
    Par Eric Boisvert dans le forum Algorithmes et structures de données
    Réponses: 22
    Dernier message: 28/09/2005, 21h11
  5. [VB6] changement de base....
    Par white angel dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 18/04/2004, 17h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo