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 :

optimiser un algorithme


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut optimiser un algorithme
    Bonjour à tous,
    ça fait des mois que je bosse sur ce problème, mais jusqu'à ce jour, je ne trouve pas une solution :
    J'explique
    J'ai deux fichier texte : un en français et l'autre en anglais sachant que chacun des fichier contient plus que 500000 ligne (donc vous pouvez imaginer dès maintenant les problème liés à la vitesse, la mémoire,..)

    voilà un exemple des 2 fichier :

    Fichier FR:
    Bonjour les amis
    Bonjour les bons amis

    Fichier ANG :
    Good morning friends
    Good morning friends of world.


    Donc le but ce ce programme c'est d'extraire des rgles de cette forme là :
    2mot contigues FR->1mot ANG (valeur de prob)

    Mot1 : 1er mot des 2 mots contigues en FR
    Mot 2 : 2eme mot des 2 mots contigues en FR
    Mot3 : Mot en anglais
    telque valeur de pro =(pMot1Mot3 * log2(pMot1Mot3 / (pMot1 * pMot3)) )+ (pMot1Mot2Mot3 * log2( (pMot1Mot2Mot3 * pMot1) / (pMot1Mot2 * pMot1Mot3) ))
    tel que :
    *) pMot1Mot3 = nombre de lignes où apparaisent les mot1 et mot3 ensemble / nombre total de ligne de fichier
    *) pMot1 = nombre de lignes où apparaisent les mot1 / nombre total de ligne de fichier
    *) pMot3 = nombre de lignes où apparaisent les mot3 / nombre total de ligne de fichier
    *) pMot1Mot2Mot3 = nombre de lignes où apparaisent les mot1 , mot2 et mot3 ensemble / nombre total de ligne de fichier
    *) pMot1Mot2 = nombre de lignes où apparaisent les mot1 et mot2 ensemble / nombre total de ligne de fichier.


    Donc en suivant cet exemple on trouve ca comme resultat :

    Bonjour les->good(0.52148)
    Bonjour les->morning (0.5412)
    Bonjour les-> friends (0.325147)
    Bonjour les->of (0.65812)
    Bonjour les-> world (0.82452).

    Franchement j'ai essayé pas mal de fois avec différents structures de données, mais le problème reste le même c'est la lenteur d'exécution, il reste environ 5ou 6 jours tourner.
    Alors que mon boss m'a dit de chercher une solution le plus rapidement possible de tel façon il tourne que pendant des heures.

    Est ce que vous pouvez me donner des idées svp?

    Merci

    Je serai reconnaissante

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

    Petites questions en vrac, désolé si certaines semblent trop naïves.

    • Le compilateur est-il bien réglé en mode release
    • Des fioritures sont-elles présentes ? (barre de défilement trop souvent rafraichie, de trop nombreux printf...)
    • L'accès au fichiers est il optimisé (pas d'utilisation d'appels système)
    • Les valeurs utilisés dans plusieurs calculs sont elles stockées plutôt que re-calculées à chaque fois ? *
    • La formule est elle optimisée ? **
    • Comment est calculé log2 ?

    * Par exemple, si on travaille sur (bonjour, les, good) puis sur (bonjour, les, morning) on peut réutiliser pMot1, pMot2 et pMot1Mot2. (et les logarithmes associés, voir ce qui suit)

    ** Sachant que log(A*B) = log(A) + log(B), on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pro =(pMot1Mot3 * log2(pMot1Mot3 / (pMot1 * pMot3)) ) 
    + (pMot1Mot2Mot3 * log2( (pMot1Mot2Mot3 * pMot1) / (pMot1Mot2 * pMot1Mot3) ))
     
    pro = pMot1Mot3 * (log2(pMot1Mot3) - log2(pMot1) - log2(pMot3)) 
    + pMot1Mot2Mot3 * (
        log2( pMot1Mot2Mot3 ) * log2(pMot1) 
        - log2(pMot1Mot2) - log2(pMot1Mot3)
      )
    On voit ici qu'on peut même précalculer log2(pMot1) et log2(pMot1Mot3), pour voir si on y gagne.

  3. #3
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Citation Envoyé par mabu Voir le message
    Bonjour,

    Petites questions en vrac, désolé si certaines semblent trop naïves.

    • Le compilateur est-il bien réglé en mode release
    • Des fioritures sont-elles présentes ? (barre de défilement trop souvent rafraichie, de trop nombreux printf...)
    • L'accès au fichiers est il optimisé (pas d'utilisation d'appels système)
    • Les valeurs utilisés dans plusieurs calculs sont elles stockées plutôt que re-calculées à chaque fois ? *
    • La formule est elle optimisée ? **
    • Comment est calculé log2 ?

    * Par exemple, si on travaille sur (bonjour, les, good) puis sur (bonjour, les, morning) on peut réutiliser pMot1, pMot2 et pMot1Mot2. (et les logarithmes associés, voir ce qui suit)

    ** Sachant que log(A*B) = log(A) + log(B), on peut écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    pro =(pMot1Mot3 * log2(pMot1Mot3 / (pMot1 * pMot3)) ) 
    + (pMot1Mot2Mot3 * log2( (pMot1Mot2Mot3 * pMot1) / (pMot1Mot2 * pMot1Mot3) ))
     
    pro = pMot1Mot3 * (log2(pMot1Mot3) - log2(pMot1) - log2(pMot3)) 
    + pMot1Mot2Mot3 * (
        log2( pMot1Mot2Mot3 ) * log2(pMot1) 
        - log2(pMot1Mot2) - log2(pMot1Mot3)
      )
    On voit ici qu'on peut même précalculer log2(pMot1) et log2(pMot1Mot3), pour voir si on y gagne.
    Bonjour Mabu,
    Je te remercie pour ta reponse et d'avoir pris la peine de lire mon message
    • Le compilateur est-il bien réglé en mode release
    • Des fioritures sont-elles présentes ? (barre de défilement trop souvent rafraichie, de trop nombreux printf...)

    Concernnat des 2 point ils sont bien reglés oui , je suis sûre de ça,
    Mais
    • L'accès au fichiers est il optimisé (pas d'utilisation d'appels système)
    • Comment est calculé log2 ?
    • L'accès au fichiers est il optimisé (pas d'utilisation d'appels système)

    Je ne suis pas sûre de ça

    et

    * Par exemple, si on travaille sur (bonjour, les, good) puis sur (bonjour, les, morning) on peut réutiliser pMot1, pMot2 et pMot1Mot2. (et les logarithmes associés, voir ce qui suit)
    Je ne vois pas trop comment faire ça.
    (je pense que je vais tout recommencer dès le debut
    Pour les Log2, ya un probleme? , j'utilise la biblio math.h et je mets Log2 directement

    Merci beaucoup

  4. #4
    Invité(e)
    Invité(e)
    Par défaut
    Citation Envoyé par étoile de mer Voir le message
    • L'accès au fichiers est il optimisé (pas d'utilisation d'appels système)
    Je ne suis pas sûre de ça
    Pour travailler avec les fichiers, utilises tu open/read... qui sont des appels systèmes à éviter donc, ou plutôt fopen/fread... ?

    Pour les Log2, ya un probleme? , j'utilise la biblio math.h et je mets Log2 directement
    Je pose la question car j'ai déjà vu écrit :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    #define log2(x) log(x)/log(2)
    ce qui n'est pas un modèle d'optimisation.

  5. #5
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    @mabu :
    La formule alternative pour pro est sans doute plus lente à exécuter que la formule d'origine :
    Elle demande le calcul de 5 log() et 8 opérations "élémentaires" (5 +- et 3*) alors qu'à l'origine il suffisait de 2 log() et 8 opérations "élémentaires" (2+-, 2* et 4/). Le temps de calcul des log() est certainement pénalisant.

    @étoile de mer :
    Probalement, le temps pour établir les différents paramètres pMot1Mot2Mot3, pMot1Mot2, pMot1Mot3,... doit être bien supérieur à celui du calcul de pro une fois ces paramètres obtenus.

  6. #6
    Membre éclairé Avatar de étoile de mer
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    978
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 978
    Par défaut
    Citation Envoyé par diogene Voir le message
    @mabu :
    @étoile de mer :
    Probalement, le temps pour établir les différents paramètres pMot1Mot2Mot3, pMot1Mot2, pMot1Mot3,... doit être bien supérieur à celui du calcul de pro une fois ces paramètres obtenus.
    Merci Diogene,
    Je ne vois pas ce que tu veux dire, tu peux s'il te plait m'expliquer un peu?
    Merci

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/09/2011, 15h47
  2. Optimisation par algorithme génétique
    Par k.emna dans le forum Mathématiques
    Réponses: 9
    Dernier message: 15/04/2011, 13h28
  3. coa: optimisation par algorithme genetique
    Par el-bey2 dans le forum MATLAB
    Réponses: 4
    Dernier message: 23/10/2010, 12h43
  4. Besoin d'aide pour optimiser un algorithme
    Par predat dans le forum Général Python
    Réponses: 5
    Dernier message: 21/08/2010, 01h29
  5. optimisation d'algorithme et calcul scientifiqie
    Par le_voisin dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 19/01/2009, 19h39

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