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

SL & STL C++ Discussion :

Optimiser la rapidité du programme d'un arbre léxicographique


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Par défaut Optimiser la rapidité du programme d'un arbre léxicographique
    Bonjour à tous,
    je souhaiterais avoir des conseils sur un code que j'ai fait car il est pas très rapide, même si c'est pour traiter beaucoup de données (100 000 mots : le nombre de mots en français) Il met en gros 3 secondes à charger. Je voulais savoir si ce code pourrait être amélioré ?
    Merci de vos conseils.

    Voici les codes :

    Dictionnaire.h
    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
    #include <iostream>
    #include <string>
    #include <fstream>
     
    class Dictionnaire_fils;
     
    class Dictionnaire {
     
    public:
    	/*constructeurs, destructeur, accesseurs*/
    	Dictionnaire();
    	Dictionnaire(const std::string &adresseFichierDictionnaire);
    	~Dictionnaire();
     
    	void setFils(Dictionnaire_fils *fils);
    	Dictionnaire_fils* getFils();
     
    	/* methodes*/
    	void ajouterMot(const std::string &mot);
     
    protected:
    	/* attributs */
     
    	bool m_estMot;
    	Dictionnaire_fils *m_fils;
     
    };
    Dictionnaire.cpp:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    #include "Dictionnaire.h"
    #include "Dictionnaire_fils.h"
     
    /*constructeurs, destructeur, accesseurs*/
    Dictionnaire::Dictionnaire() {
    	m_estMot = false;
    	m_fils = 0;
    }
     
    Dictionnaire::Dictionnaire(const std::string &adresseFichierDictionnaire) {
    	m_estMot = false;
    	m_fils = NULL;
    	std::ifstream fichier(adresseFichierDictionnaire.c_str());
    	if(!fichier) { std::cerr << "Erreur lors de l'ouverture du dictionnaire " << adresseFichierDictionnaire << std::endl; exit(-1);  }
    	std::string str;
    	while(getline(fichier,str)) {
    		ajouterMot(str);
    		/*afficherArbre();*/
    	}
    }
     
    Dictionnaire::~Dictionnaire() {
     
    }
     
    void Dictionnaire::setFils(Dictionnaire_fils *fils) {
    	m_fils = fils;
    }
     
    Dictionnaire_fils* Dictionnaire::getFils() {
    	return m_fils;
    }
     
    /*Méthodes*/
     
    void Dictionnaire::ajouterMot(const std::string &mot) {
    	if(mot.empty()) { m_estMot = true; }
    	else {
    		if(m_fils == NULL) {
    			m_fils = new Dictionnaire_fils(mot[0],this);
    			m_fils->ajouterMot(mot.substr(1));
    		}
    		else {
    			m_fils->ajouterMotFrere(mot);			
    		}
    	}
    }
    Dictionnaire_fils.h
    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
    #ifndef DICTIONNAIRE_FILS
    #define DICTIONNAIRE_FILS
     
    #include "Dictionnaire.h"
     
    Dictionnaire dico ;
     
    class Dictionnaire_fils : public Dictionnaire{
    public:
    	Dictionnaire_fils();
    	Dictionnaire_fils(char caractere,Dictionnaire *pere = NULL,Dictionnaire_fils *frere = NULL);
    	~Dictionnaire_fils();
     
    	char getChar();
    	void setChar(const char nouveauChar);
    	void setFrere(Dictionnaire_fils *frere);
     
    	void ajouterMotFrere(const std::string &mot,Dictionnaire_fils *createur = NULL);
     
    protected:
    	char m_char;
    	Dictionnaire *m_pere;
    	Dictionnaire_fils *m_frere;
     
     
    };
    Dictionnaire_fils.cpp
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    #include "Dictionnaire_fils.h"
     
    Dictionnaire_fils::Dictionnaire_fils() : Dictionnaire() {
    	m_char = ' ';
    	m_pere = NULL;
    	m_frere = NULL;
    }
     
    Dictionnaire_fils::Dictionnaire_fils(char caractere, Dictionnaire *pere, Dictionnaire_fils *frere) : Dictionnaire(){
    	m_char = caractere ;
    	m_pere = NULL;
    	m_frere = NULL;
    	if(pere != NULL) {
    	m_pere = pere;
    	}
    	if(frere != NULL) {
    	m_frere = frere;
    	}
    }
     
    Dictionnaire_fils::~Dictionnaire_fils() {
    		delete m_fils;
    		delete m_frere;
    		delete m_pere;
    }
     
    char Dictionnaire_fils::getChar() {
    	return m_char;
    }
     
    void Dictionnaire_fils::setChar(const char nouveauChar) {
    	m_char = nouveauChar;
    }
     
    void Dictionnaire_fils::setFrere(Dictionnaire_fils *frere) {
    	m_frere = frere;
    }
     
     
    void Dictionnaire_fils::ajouterMotFrere(const std::string &mot,Dictionnaire_fils *createur) {
    	char lettre = mot[0];
    	if(lettre > m_char) {
    		if(m_frere == NULL) {
    			m_frere = new Dictionnaire_fils(lettre,m_pere);
    			m_frere->ajouterMot(mot.substr(1));
    		}
    		else {
    			m_frere->ajouterMotFrere(mot,this);
    		}
    	}
    	else if (lettre == m_char) {
    		ajouterMot(mot.substr(1));
    	}
    	else {
    		if(createur == NULL) { // c'est son père qui l'a appelé
    			Dictionnaire_fils *nouveau_fils = new Dictionnaire_fils(lettre,m_pere,this);
    			m_pere->setFils(nouveau_fils); // on met le nouveau fils au père
    			nouveau_fils->ajouterMot(mot.substr(1));
    		}
    		else { //c'est son frère gauche qui l'a apellé
    			Dictionnaire_fils *nouveau_frere = new Dictionnaire_fils(lettre,m_pere,this);
    			createur->setFrere(nouveau_frere);
    			nouveau_frere->ajouterMot(mot.substr(1));
    		}
    	}
    }

  2. #2
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    12
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 12
    Par défaut
    L'emploie du type "string" durant l'insertion (ajouterMot / ajouterMotFils) implique l'instantiation d'un grand nombre d'objets temporaires. L'utilisation de la classe string simplifie effectivement la manipulation des chaînes, mais au détriment des performances.

    Si tu utilisais des chaines de caractères (const char *) dans ajouterMot:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    void Dictionnaire::ajouterMot(const char * mot)
    alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_fils->ajouterMot(mot.substr(1));
    (appel de fonction + création d'un nouvel objet)

    pourrait efficacement être remplacé par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    m_fils->ajouterMot(mot+1);
    (aucun cout de traitement ni de mémoire)

    Ce n'est qu'un des points sur lesquels tu gagnerais beaucoup à utiliser des chaines natives.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Par défaut
    merci beaucoup je viens de modifier juste la fonction d'ajout de mot en remplaçant les string par des char* est je suis passé de 3 sec à 0.95 ! c'est quand même pas négligeable !
    Je vais continuer de faire pareil avec les autres fonctions qui sont beaucoup appelées, mais en tout cas merci beaucoup, ça améliore beaucoup!

    D'autres remarques ?

    Edit:une autre question, est ce que c'est grave d'utiliser 30 Mo de RAM pour un programme?

  4. #4
    Membre expérimenté

    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    215
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mai 2009
    Messages : 215
    Par défaut
    Ca dépend ce que fait le programme en question.

    Mais si tu veux absolument réduire, regarde si les données mise en mémoire par le programme sont bien toutes utiles en même temps (s'il est critique d'y accéder rapidement, ou si ça peut se trouver sur disque / dans une DB), si elles ne peuvent pas être représentées autrement (de façon à réduire l'espace nécessaire).

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 8
    Par défaut
    euh en fait pour l'instant j'aimerais faire un programme qui reconnaisse la nature des mots. Donc pour qu'il puisse reconnaitre plusieurs phrase en pas trop longtemps, je pense que je suis obligé de tout stocke en mémoire.

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

Discussions similaires

  1. programme d'un arbre en devC++
    Par sdfsam dans le forum C
    Réponses: 13
    Dernier message: 08/12/2010, 19h26
  2. [Débutant] Optimisation de fonction pour programme qui tourne 1 heure !
    Par TopCao dans le forum MATLAB
    Réponses: 24
    Dernier message: 01/02/2010, 23h10
  3. Comment optimiser cet unité de programme
    Par satanas dans le forum Forms
    Réponses: 9
    Dernier message: 29/07/2009, 10h51
  4. [LabVIEW 7.0 Express] Rapidité du programme
    Par Kartoon67 dans le forum LabVIEW
    Réponses: 3
    Dernier message: 06/05/2009, 10h29

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