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

C++ Discussion :

Optimisation de comparaison de chaines


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut Optimisation de comparaison de chaines
    Bonjour à tous,

    actuellement j'ai un code structuré ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
    for(i....)
    {
        for(k...)
        {
                                    if(strcmp(paramName,"val1")==0)
    				{
    					TAB[k]=(float)Obj->val1[k];
    				}
    				else if(strcmp(paramName,"val2")==0)
    				{
    					TAB[k]=(float)Obj->val2[k];
    				}
    				else if(strcmp(paramName,"val3")==0)
    				{
    					TAB[k]=(float)Obj->val3[k];
    				}
    				else if(strcmp(paramName,"val4")==0)
    				{
    					TAB[k]=(float)Obj->val4[k];
    				}
    				else if(strcmp(paramName,"val5")==0)
    				{
    					V_TAB[k]=(float)Obj->val5[k];
    				}
                                    etc..etc..
     
        }
    }
    Sachant que la liste de strcmp est bcp plus longue, y aurait-il pas un moyen d'optimiser cela car le traitement est vraiment long sachant qu'on fait tjrs appelle à l'attribut de l'Obj, qui est strictement égale au paramName

    Merci d'avance pour vos réponses

  2. #2
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Bonjour.

    Pour commencer, une petite question : tu fais du C ou du C++ ?
    Là, c'est du code C que je vois…
    Si c'est le cas, tu peux éventuellement créer une structure pour stocker à la fois le nom du paramètre et sa valeur, et utiliser un tableau de ces structures pour les représenter dans ton objet.
    Ça fera une sorte de « map »…
    Ensuite, au lieu de faire cette liste de « strcmp », tu recherches dans ton « map » le nom du paramètre adéquat (à l'aide de « bsearch », par exemple), et tu auras directement accès au champ que tu veux modifier.

    Honnêtement, ça ne changera pas grand chose pour ton programme, il fera tout autant de comparaisons de chaînes.
    Par contre, ton code sera beaucoup plus concis.

    Si tu veux vraiment faire du C++, en revanche, tu n'as peut-être pas la bonne approche.
    Déjà, utilise les « std::string », et fais un switch !
    Euh en fait non, le code sera tout aussi lourd…

    Plus sérieusement, la meilleure idée qui me vient est d'utiliser un « std::map » (et les « std::string »).
    Mais c'est peut-être une structure un peu lourde pour ce que tu veux faire.
    Alors tu peux également utiliser l'astuce que je donne au-dessus, avec d'autres fonctions de recherche, comme « std::find ».

    Ah, et pour parcourir les conteneurs, les itérateurs, il n'y a que ça de vrai…
    (Pour les tableaux aussi, d'ailleurs… )

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    Salut merci pour ta réponse, c'est en effet du c++

    En utilisant un switch sur des string, le code sera aussi lourd, mais est-ce que cela signifie que le traitement sera aussi long ?

    Car moi c'est au niveau du traitement que je veux optimiser

  4. #4
    Rédacteur

    Avatar de ram-0000
    Homme Profil pro
    Consultant en sécurité
    Inscrit en
    Mai 2007
    Messages
    11 517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant en sécurité
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mai 2007
    Messages : 11 517
    Par défaut
    Peut être que tu peux imaginer une solution à base de hash si la liste des chaines de caractères à tester est vraiment très longue.

    Déjà, un tableau de structure qui contient les chaines et les hash de ces chaines. Le hash est à calculer une fois (hors du programme) pour créer des données statiques.

    Ensuite quand tu rentres dans ta fonction de recherche, tu calcules le hash de ta string, tu regardes dans ton tableau statique toutes les strings qui ont le même hash (c'est une comparaison de nombres, cela devrait aller plus vite) et ensuite, tu n'a plus que quelques comparaisons de chaines à faire en cas de collision de hash.

    La difficulté dans cette approche est de trouver une fonction de hash sans trop de collisions par rapport à tes strings attendues et ensuite de créer le tableau de données statiques.
    Raymond
    Vous souhaitez participer à la rubrique Réseaux ? Contactez-moi

    Cafuro Cafuro est un outil SNMP dont le but est d'aider les administrateurs système et réseau à configurer leurs équipements SNMP réseau.
    e-verbe Un logiciel de conjugaison des verbes de la langue française.

    Ma page personnelle sur DVP
    .

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    162
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 162
    Par défaut
    Bonjour Raymond,

    J'ai plus de 50 chaines à tester, sachant que j'itère environs 100 fois
    L'idée du Hash me semble pas mal, mais je n'arrive pas à savoir comment je peux directement appelé le bon attribut par la suite exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    maMap[hash(val1)]=(float)Obj->val1[k];
    maMap[hash(val2)]=(float)Obj->val2[k];
    maMap[hash(val3)]=(float)Obj->val3[k];
    paramName="val2";
    for (k....)
    {
    if(maMap[hash(paramName)])
    {
        TAB[k]=maMap[hash(paramName)];
    }
     
    }
    ça serait un truc dans le genre?

  6. #6
    Invité(e)
    Invité(e)
    Par défaut
    Bonjour,

    Si tes chaines de caractères sont de type "val1", "val2"... tu peux tenter lire d'analyser le contenu de la chaine plutôt que de comparer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    if(strcmp(paramName,"val1")==0) {
     
    } else if(strcmp(paramName,"val2")==0) {
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    int index;
    if(1 == sscanf(paramName, "val%d", &index)) {
        switch(index) {
              case 1 :
            TAB[k]=(float)Obj->val1[k];
            break;
     
              case 2 :
            TAB[k]=(float)Obj->val2[k];
            break
            /* ... */
        }
    } else {
        /* paramName n'est pas de forme "val%d"*/
    }

  7. #7
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par rockt13 Voir le message
    En utilisant un switch sur des string, le code sera aussi lourd, mais est-ce que cela signifie que le traitement sera aussi long ?
    En fait, oui.
    La structure de contrôle « switch » n'est rien d'autre qu'une simplification d'écriture, et au final les traitements sont pratiquement les mêmes.
    Les différences principales entre un « switch » et une suite de « if … then … else » sont :
    • l'expression à tester n'est évaluée qu'une seule fois ;
    • les valeurs de comparaison sont obligatoirement des constantes ;
    • la fonction de comparaison est forcément l'opérateur « == ».


    Comparer deux std::string avec l'opérateur == ou comparer deux char* avec strcmp() revient exactement au même en interne.
    Donc toutes les méthodes que je t'ai données ne retirent pas toutes ces comparaisons, elles ne font que les masquer.
    Mais tu peux optimiser la recherche en triant les chaînes de caractères par ordre lexicographique croissant (indispensable pour utiliser bsearch(), et comportement normal des std::map).

    Mais si tu veux encore accélérer la recherche, je crois que le mieux est d'associer un nombre à chaque chaîne : une comparaison sur des nombres est beaucoup plus rapide que sur des chaînes.
    Le plus évident est probablement de passer par une fonction de hachage, et là on revient sur ce que proposait ram-0000.

  8. #8
    Membre très actif
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    688
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 688
    Par défaut
    Citation Envoyé par Steph_ng8 Voir le message
    Bonjour.

    Pour commencer, une petite question : tu fais du C ou du C++ ?
    Là, c'est du code C que je vois…
    modulo qu'il est tout à fait correct d'utiliser la libC intégrer à la biblio du C++ (qui est une version arrangée de la libC) .

  9. #9
    Membre émérite Avatar de Steph_ng8
    Homme Profil pro
    Doctorant en Informatique
    Inscrit en
    Septembre 2010
    Messages
    677
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Informatique

    Informations forums :
    Inscription : Septembre 2010
    Messages : 677
    Par défaut
    Citation Envoyé par guillaume07 Voir le message
    modulo qu'il est tout à fait correct d'utiliser la libC intégrer à la biblio du C++ (qui est une version arrangée de la libC) .
    Je n'ai jamais dit le contraire.
    Seulement si on fait du C++, autant utiliser les outils fournis par le C++… non ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Méthode optimisée de comparaison de donnees
    Par yoghisan dans le forum Langage
    Réponses: 5
    Dernier message: 30/08/2005, 11h46
  2. [langage] Comparaison de chaîne
    Par Fastshadow dans le forum Langage
    Réponses: 7
    Dernier message: 05/09/2004, 18h58
  3. comparaison de chaines de caracteres en PLSQL
    Par biozaxx dans le forum PL/SQL
    Réponses: 3
    Dernier message: 19/08/2004, 09h41
  4. Comparaison de chaines
    Par Marc_P dans le forum Linux
    Réponses: 6
    Dernier message: 17/02/2004, 17h04
  5. [LG]comparaison de chaines de caracteres
    Par thesam dans le forum Langage
    Réponses: 6
    Dernier message: 20/05/2003, 22h41

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